我正在帮助一个朋友学习 Haskell,他最近创建了这样的代码,该代码在运行时检查并产生 CPU 燃烧循环。我对此完全感到困惑。
import Control.Monad
import Control.Applicative
main = forever putStrLn "Hello, infinity"
那不应该类型检查,但确实如此。正确的版本显然是:
main = forever $ putStrLn "Hello, infinity"
令我感到奇怪和惊讶的是,无论是否导入 Control.Applicative,您都会得到不同的结果。如果不导入它,它不会输入检查:
Prelude Control.Monad> forever putStrLn "Hello, infinity"
<interactive>:1:1:
No instance for (Monad ((->) String))
arising from a use of `forever'
Possible fix: add an instance declaration for (Monad ((->) String))
In the expression: forever putStrLn "Hello, infinity"
In an equation for `it': it = forever putStrLn "Hello, infinity"
我在 Control.Applicative 的源代码中没有看到 Monad 实例((->) String
,所以我猜测由于使用 Control.Category 或 Control.Arrow 会发生一些奇怪的事情,但我不知道。所以我想我有两个问题:
- 导入 Control.Applicative 的原因是什么?
- 当它进入无限循环时会发生什么?在这种情况下,Haskell 实际上试图执行什么?
谢谢,