我是Haskell的新手(今天开始学习),我正在实现我自己的take
方法,如下所示:
grab :: (Num a, Ord a) => a -> [b] -> [b]
grab n _
| n <= 0 = []
grab _ [] = []
grab n (x:xs) = x : grab (n - 1) xs
它编译并且工作得很好。但是当我从
更改定义时怎么样?grab :: (Num a, Ord a) => a -> [b] -> [b]
到
grab :: (Num a, Ord a) => a -> [b] -> [c]
它不编译并抛出错误?我的理解是,函数定义中的变量并不真正意味着任何东西,并且几乎可以用任何东西替换它们。
那么为什么说返回值是[c]
是错误的呢?为什么我必须使用[b]
?我不明白。
答案 0 :(得分:3)
[a] -> [b] -> [b]
表示您的输入参数是a
类型的值和类型为list
的{{1}},并且您的输出为b
类型{ {1}}。您的逻辑正在实施list
,因此您返回的b
必须与您输入的take
的类型相同。
如果您执行list
,则说您要返回list
其他数据类型。如果你做了一些转换为该数据类型的事情,这将是有效的,但这不是这种情况。
因此,在您希望的实现中,输出必须是[a]->[b]->[c]
而不是list
。