发生检查:无法构造无限类型:a = [a]

mat*_*tio 4 haskell

我一直试图在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)

有人可以告诉我为什么吗?

fuz*_*fuz 8

想想第一到第五行.你想达到什么目的?你想获得一份懒惰的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)

我们在这里.就这样.

  • 您的解决方案可以说是规范的(+1),但我们应该努力帮助OP理解编译器消息. (17认同)

Ing*_*ngo 8

您的错误消息的原因是函数fibonacci返回一个数字,然而,您在第5行使用它,就像它将返回相同类型的数字列表一样.

这会导致类型检查器尝试将类型"a"与类型"[a]"统一起来,这就会出现检查错误.

想一想:你的程序中实际构建的列表在哪里?你知道,应该有一个:运算符应用于某个地方,直接或间接,但事实并非如此.因此,在您的程序中,斐波纳契数列表完全是虚构的.