Haskell 不能';t匹配预期类型‘;[整数]’;实际类型为‘;整数’;

Haskell 不能';t匹配预期类型‘;[整数]’;实际类型为‘;整数’;,haskell,Haskell,我正在创建一个斐波那契数列中所有小于或等于4000000的偶数的列表。在Haskell中,我将斐波那契级数定义为: fibs = 1 : 2 : next fibs where next (a : t@(b:_)) = (a+b) : next t 我使用以下列表来构建我的集合: [ x | x <- take 50 fibs, x `mod` 2 == 0, last x <= 4*10^6 ] [x | x 不过 …但您正在将一个整数传递给它。您不需要last来过

我正在创建一个斐波那契数列中所有小于或等于4000000的偶数的列表。在Haskell中,我将斐波那契级数定义为:

fibs = 1 : 2 : next fibs
  where
    next (a : t@(b:_)) = (a+b) : next t
我使用以下列表来构建我的集合:

[ x | x <- take 50 fibs, x `mod` 2 == 0, last x <= 4*10^6 ]
[x | x
不过

…但您正在将一个
整数
传递给它。您不需要
last
来过滤列表中的元素,只需使用:

sum [ x | x <- take 50 fibs, x `mod` 2 == 0, x <= 4*10^6 ]

这样,您就不需要任意限制50个元素。

太棒了。我的问题是将
x
看作一个列表。感谢您周到的解释和额外的选择。
[ x | x <- takeWhile (<= 4*10^6) $ take 50 fibs, x `mod` 2 == 0 ]
sum [ x | x <- take 50 fibs, x `mod` 2 == 0, last x <= 4*10^6 ]
GHCi> :t last
last :: [a] -> a
sum [ x | x <- take 50 fibs, x `mod` 2 == 0, x <= 4*10^6 ]
-- (<= 4*10^6) is shorthand for (\x -> x <= 4*10^6)
sum [ x | x <- takeWhile (<= 4*10^6) fibs, x `mod` 2 == 0 ]
-- Three equivalent alternatives:
(sum . takeWhile (<= 4*10^6)) [ x | x <-  fibs, x `mod` 2 == 0 ]
(sum . takeWhile (<= 4*10^6) . filter (\x -> x `mod` 2 == 0)) fibs
(sum . takeWhile (<= 4*10^6) . filter ((== 0) . (`mod` 2))) fibs