Haskell递归和类型错误

时间:2011-02-24 04:28:46

标签: haskell recursion types

我正在自学Haskell,学习任何编程语言的最佳方法就是使用它。我目前的“练习”是一个实施。伪代码是:

take(0, list) = [] --empty list
take(n, list) = const(head(list), take(n-1, tail(list))

我在Haskell中所做的是:

myTake :: (Num a) => a -> [b] -> [b]
myTake 0 l = []
myTake n (l:ls) = l :  myTake n-1 ls

当我在GHCi中加载文件时,这不会编译。这是我收到的错误消息:

Couldn't match expected type `[b]'
       against inferred type `[b1] -> [b1]'
In the second argument of `(:)', namely `myTake n - 1 ls'
In the expression: l : myTake n - 1 ls
In the definition of `myTake':
    myTake n (l : ls) = l : myTake n - 1 ls

我目前的Haskell资源是“为了大好的学习你的Haskell!”并且我已经多次尝试了关于类型的部分。谷歌也非常无益。我认为我还没完全理解打字。谁能解释出错了什么?

1 个答案:

答案 0 :(得分:7)

myTake n - 1 ls

被解析为

(myTake n) - (1 ls)

因为函数应用程序绑定高于任何中缀运算符。将其括起来:

myTake (n - 1) ls