State モナドを使用するこのコードが終わらない理由を教えてください。
fib' :: State [Int] ()
fib' = do l <- get
let l2 = sum (last2 l)
put (l ++ [l2])
return ()
fib'
take 10 $ execState fib' [0, 1]
ghci REPL で実行すると、関数は停止せずに実行されます。
return
命令型言語のようには機能しません。モナドごとに定義が異なり、状態モナドでは次のように定義されます。
return x = State $ \s -> (x,s)
したがって、実際には関数から抜け出すのではfib'
なく、代わりに新しい State モナドを計算の残りの部分にバインドします。
編集:
私の元の答えは真実ですが、OPの質問には答えません。OP のコードでreturn
は、no-op として機能します。OPのコードが終了しない理由については、他の回答を参照してください。return
OPのコードサンプルに不必要に現れたことを考えると、指摘することがまだ重要だと思うので、私はまだ答えをここに残しています
return ()
行は冗長であり、削除できます(++)
最初の引数のサイズが O(N) であるため、ほとんどの場合、悪い考えです。