2

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 で実行すると、関数は停止せずに実行されます。

4

5 に答える 5

4

return命令型言語のようには機能しません。モナドごとに定義が異なり、状態モナドでは次のように定義されます。 return x = State $ \s -> (x,s)

したがって、実際には関数から抜け出すのではfib'なく、代わりに新しい State モナドを計算の残りの部分にバインドします。

編集:

私の元の答えは真実ですが、OPの質問には答えません。OP のコードでreturnは、no-op として機能します。OPのコードが終了しない理由については、他の回答を参照してください。returnOPのコードサンプルに不必要に現れたことを考えると、指摘することがまだ重要だと思うので、私はまだ答えをここに残しています

于 2013-08-12T10:40:17.437 に答える
4
  1. return ()行は冗長であり、削除できます
  2. (++)最初の引数のサイズが O(N) であるため、ほとんどの場合、悪い考えです。
  3. あなたの目標は単一の無限リストを構築することですが、長さが増加する多くのリストを構築します
于 2013-08-12T10:51:49.937 に答える