证明
在这篇博文中,Tekmo 指出我们可以证明ExitSuccess
exits 因为(我认为)它就像Const
那个构造函数的函子(它不携带x
so的fmap
行为const
)。
使用操作包,TekmoTeletypeF
可能会被翻译成这样:
data TeletypeI a where
PutStrLn :: String -> TeletypeI ()
GetLine :: TeletypeI String
ExitSuccess :: TeletypeI ()
我已经读到操作与自由单子同构,但是我们可以在这里证明ExitSuccess
存在吗?在我看来,它遇到了与它完全相同的问题exitSuccess :: IO ()
,特别是如果我们要为它编写一个解释器,我们需要像它没有退出一样编写它:
eval (ExitSuccess :>>= _) = exitSuccess
与不涉及任何模式通配符的免费 monad 版本相比:
run (Free ExitSuccess) = exitSuccess
懒惰
在Operational Monad Tutorial apfelmus 中提到了一个缺点:
表示为 s -> (a,s) 的状态单子可以处理一些无限程序,例如
evalState (sequence . repeat . state $ \s -> (s,s+1)) 0
而指令列表方法没有希望处理这个问题,因为只有最后一个 Return 指令可以返回值。
对于免费的单子也是如此吗?