私は友人が 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 を使用しているため、何かおかしなことが起こっていると思いますが、わかりません。だから私は2つの質問があると思います:
- これを可能にする Control.Applicative のインポートについてはどうですか?
- 無限ループに入るとどうなる?その場合、Haskell は実際に何を実行しようとしているのでしょうか?
ありがとう、