gpt4 book ai didi

haskell - 无法将预期类型 ‘[Integer]’ 与实际类型 ‘Integer’ 匹配

转载 作者:行者123 更新时间:2023-12-04 04:19:39 25 4
gpt4 key购买 nike

我正在创建斐波那契数列中小于或等于 4,000,000 的所有偶数的列表。在 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 ]

但是,GHC 正在抛出 Couldn't match expected type ‘[Integer]’ with actual type ‘Integer’错误。

我理解谓词 last x <= 4*10^6 ,对错误负责。受到哈马尔回答的启发here ,我最初的 react 是确保4*10^6是正确的类型,所以我尝试将谓词重新表述为 last x <= toInteger 4*10^6无济于事;同样的错误。我还认为也许我需要指定 4*10^6作为单例(即 [4*10^6] ),但也没有运气。

我正在努力了解到底发生了什么以及如何最好地解决该问题。

最佳答案

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

take 50 fibs 是一个 Integer ([Integer]) 列表,x 是一个元素该列表的(因此是一个Integer)。 last 是一个接受列表的函数...

GHCi> :t last
last :: [a] -> a

...但是您正在向其传递一个Integer。您不需要 last 来过滤列表理解中的元素;只需使用:

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

顺便说一句,鉴于您知道 fibs 中的数字总是增加,您可以将表达式编写为:

-- (<= 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

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

关于haskell - 无法将预期类型 ‘[Integer]’ 与实际类型 ‘Integer’ 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42742594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com