T S*_*uds 3 recursion haskell types
我正在自学Haskell,学习任何编程语言的最佳方法就是使用它.我目前的"练习"是一个实施.伪代码是:
take(0, list) = [] --empty list
take(n, list) = const(head(list), take(n-1, tail(list))
Run Code Online (Sandbox Code Playgroud)
我在Haskell中得到的结论是:
myTake :: (Num a) => a -> [b] -> [b]
myTake 0 l = []
myTake n (l:ls) = l : myTake n-1 ls
Run Code Online (Sandbox Code Playgroud)
当我在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
Run Code Online (Sandbox Code Playgroud)
我目前的Haskell资源是"为了大好的学习你的Haskell!" 并且我已经多次阅读关于类型的部分试图解决这个问题.谷歌也非常无益.我认为我还没完全理解打字.任何人都可以解释出了什么问题吗?
myTake n - 1 ls
Run Code Online (Sandbox Code Playgroud)
被解析为
(myTake n) - (1 ls)
Run Code Online (Sandbox Code Playgroud)
因为函数应用程序绑定高于任何中缀运算符.用括号括起来:
myTake (n - 1) ls
Run Code Online (Sandbox Code Playgroud)