我一直试图在haskell 做第二个项目欧拉问题,但我一直在:Occurs check: cannot construct the infinite type: a = [a]
fibonacci 0 _ = 0
fibonacci 1 _ = 1
fibonacci x xs = (xs!!(x-2)) + (xs!!(x-1))
fibonaccisLessThan = takeWhile(<40) $ foldr fibonacci [] [0..]
sumOfEvenFibonaccis = sum $ filter even $ fibonaccisLessThan
main = putStrLn $ show $ sumOfEvenFibonaccis
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我为什么吗?
想想第一到第五行.你想达到什么目的?你想获得一份懒惰的Fibonaccis列表.但你的方法很奇怪.我没看透你的代码,但我想我对你尝试做的事情有所了解.尝试给你的函数类型签名,然后你会很快看到,出了什么问题.
这是一个更短的方式:
想一想你的方法.让我们尝试定义一个懒惰的Fibonacci数列表:
fibs = undefined
Run Code Online (Sandbox Code Playgroud)
所以现在怎么办?我们知道的第一件事是前两个元素是0和1:
fibs = 0 : 1 : undefined
Run Code Online (Sandbox Code Playgroud)
其余的?它fibs添加了移位版本fibs.看这个.zipWith f使用函数将列表与另一个列表组合在一起f:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
我们在这里.就这样.
您的错误消息的原因是函数fibonacci返回一个数字,然而,您在第5行使用它,就像它将返回相同类型的数字列表一样.
这会导致类型检查器尝试将类型"a"与类型"[a]"统一起来,这就会出现检查错误.
想一想:你的程序中实际构建的列表在哪里?你知道,应该有一个:运算符应用于某个地方,直接或间接,但事实并非如此.因此,在您的程序中,斐波纳契数列表完全是虚构的.
| 归档时间: |
|
| 查看次数: |
7204 次 |
| 最近记录: |