Haskell 递归和类型错误

标签 haskell recursion types

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

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!”我已经多次阅读有关类型的部分,试图弄清楚这一点。谷歌也异常无助。我认为我还没有完全理解打字。谁能解释一下出了什么问题吗?

最佳答案

myTake n - 1 ls

解析如下

(myTake n) - (1 ls)

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

myTake (n - 1) ls

关于Haskell 递归和类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5100354/

相关文章:

Python 花旗骰 : Creating a list with sets. 意外类型

haskell - 如何通过 Haskell 中的弱指针缓存构建具有重复消除的无限树

haskell - 将集合并集实现为幺半群

types - 如何使用 JSoup 从网页获取资源类型?

vba - 获取VBA中的子目录列表

java - 这个递归循环代码是如何执行的

c# - 获取 IEnumerable<T> 中 T 的类型

haskell - 无法在 Haskell 中链接 FFI 库

haskell - 记录类型 Haskell 中的多态函数

python - 这种相互的 "recursion"叫什么?