在一个文件中,我试图定义一个这样的函数:
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 < 1,这样 myReplicate 3.2 1 就会产生 [1, 1, 1,],但是我为什么要为浮点数烦恼呢?