在文件中,我正在尝试定义这样的函数:
myReplicate :: (Int a) => a -> b -> [b]
myReplicate n x
| n <= 0 = []
| otherwise = x : myReplicate (n-1) x
但是当我尝试将文件加载到ghci时,我收到此错误:
ghci>:l 1.hs
[1 of 1] Compiling Main ( 1.hs, interpreted )
1.hs:38:17:
`Int' is applied to too many type arguments
In the type signature for `myReplicate':
myReplicate :: Int a => a -> b -> [b]
Failed, modules loaded: none.
ghci告诉我myReplicate的类型应该是:
ghci>:t myReplicate
myReplicate :: (Num a, Ord a) => a -> a1 -> [a1]
如果我将类型声明更改为ghci推荐的内容:
myReplicate :: (Num a, Ord a) => a -> b -> [b]
...然后函数编译并“工作”。但是,它的工作原理如下:
ghci>myReplicate 3.2 1
[1,1,1,1]
为什么我不能声明myReplicate仅将Int作为第一个参数(同时考虑到Int从Ord类中下降(?)的事实)?我想我可以把我的第一个后卫变成x&lt; 1,所以myReplicate 3.2 1会产生[1,1,1],但为什么我要打扰浮动?
答案 0 :(得分:7)
Int是一种类型,而不是类型类。你想要的是
myReplicate :: Int -> b -> [b]
或者可能更准确地说
myReplicate :: Int -> Int -> [Int]
这是关于类型和类型类的好教程:http://learnyouahaskell.com/types-and-typeclasses