Haskell定义了一个函数混淆

时间:2014-04-21 06:06:06

标签: haskell

我是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]?我不明白。

1 个答案:

答案 0 :(得分:3)

[a] -> [b] -> [b]表示您的输入参数是a类型的值和类型为list的{​​{1}},并且您的输出为b类型{ {1}}。您的逻辑正在实施list,因此您返回的b必须与您输入的take的类型相同。

如果您执行list,则说您要返回list其他数据类型。如果你做了一些转换为该数据类型的事情,这将是有效的,但这不是这种情况。

因此,在您希望的实现中,输出必须是[a]->[b]->[c]而不是list