証明
このブログ投稿では、Tekmoは、それがそのコンストラクターのファンクターのようなものであるため(私は推測します)、それが終了することを証明できることを指摘していますExitSuccess
(それはそのように動作Const
しません)。x
fmap
const
オペレーショナルパッケージを使用すると、Tekmoは次のTeletypeF
ように翻訳される可能性があります。
data TeletypeI a where
PutStrLn :: String -> TeletypeI ()
GetLine :: TeletypeI String
ExitSuccess :: TeletypeI ()
運用は無料のモナドと同型であることを読みましたが、ここでそれが存在することを証明できExitSuccess
ますか?それはまったく同じ問題を抱えているように私には思えますexitSuccess :: IO ()
、そして特に私たちがそれのためにインタプリタを書くなら、それが終了しなかったかのようにそれを書く必要があるでしょう:
eval (ExitSuccess :>>= _) = exitSuccess
パターンワイルドカードを含まない無料のモナドバージョンと比較してください。
run (Free ExitSuccess) = exitSuccess
怠惰
オペレーショナルモナドチュートリアルで、apfelmusは欠点について言及しています。
s->(a、s)として表される状態モナドは、次のようないくつかの無限のプログラムに対処できます。
evalState (sequence . repeat . state $ \s -> (s,s+1)) 0
一方、命令リストアプローチでは、最後のReturn命令のみが値を返すことができるため、これを処理する見込みはありません。
これは無料のモナドにも当てはまりますか?