gpt4 book ai didi

使用 foldr 求和时出现 Haskell 错误。

转载 作者:行者123 更新时间:2023-12-02 08:40:43 25 4
gpt4 key购买 nike

我正在寻找斐波那契数列的总和。这就是我坚持的地方:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

main = do putStrLn "Enter a number:"
num <- readLn
foldr (+) 0 (take num fibs)

错误是:

No instance for (Num (IO t0))
arising from the literal `0'
Possible fix: add an instance declaration for (Num (IO t0))
In the second argument of `foldr', namely `0'
In the expression: foldr (+) 0 (take num fibs)
In the expression:
do { putStrLn "Enter a number:";
num <- readLn;
foldr (+) 0 (take num fibs) }

我到底哪里错了?

最佳答案

您可能想要打印结果:

main = do putStrLn "Enter a number:"
num <- readLn
print $ foldr (+) 0 (take num fibs)

错误消息的原因是 do block 中的每个语句都必须属于同一个 monad。在 main 的情况下,它是 IO。但是,此处 foldr 的结果是一个数字,而不是 IO 操作。

错误消息令人困惑,因为 GHC 在其所有智慧中得出的结论是 IO 操作必须是数字,这当然是无稽之谈。

当您遇到令人困惑的类型错误时,向所涉及的某些表达式添加一些类型注释通常很有用,向 GHC 解释您期望的类型。这通常会给您从 GHC 返回的更好的错误消息。

例如,如果您在 foldr 行的末尾添加 ::Integer,您将收到此消息:

Couldn't match expected type `IO b0' with actual type `Integer'
In a stmt of a 'do' block: foldr (+) 0 (take num fibs) :: Integer
In the expression:
do { putStrLn "Enter a number:";
num <- readLn;
foldr (+) 0 (take num fibs) :: Integer }
In an equation for `main':
main
= do { putStrLn "Enter a number:";
num <- readLn;
foldr (+) 0 (take num fibs) :: Integer }

这里更容易看出问题所在。 GHC 需要一个类型为 IO b0 的语句,你给了它一个Integer

关于使用 foldr 求和时出现 Haskell 错误。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16824455/

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