任何方法可以恢复足够的懒惰以打结monad结?

gat*_*ado 11 monads haskell monadfix tying-the-knot

我想写一个光滑的代码(通过打结来节省我很多时间来实现).它大致是这样的,

n <- myinstr n x
Run Code Online (Sandbox Code Playgroud)

在理论上,myinstr应该运行x以获得一个价值,这将成为n.myinstrStatemonad 中运行,将n进入状态,但这不会影响x计算.

我尝试过使用DoRec和实现的mfix,

instance Monad  => MonadFix (MyMonad ) where
    mfix f = fix (\mx -> mx >>= f)
Run Code Online (Sandbox Code Playgroud)

事情冻结了.有没有任何方法可以修复我的代码(或者第一次正确设计它的方法),还是应该写一些更直接的东西?

aug*_*tss 14

没有通用的方法可以将任意monad作为实例MonadFix.实际的代码取决于monad,并且它甚至不可能适用于所有monad.您可以查看各种monad以了解它是如何完成的.如果你的monad实际上State应该已经有了一个实例.

  • 有趣的是,它适用于所有的comonad,但是他们担心的问题非常少.= / (10认同)
  • @JohnL:我在这里聚会很晚,但IO已经是MonadFix的一个实例.你的意思是什么? (3认同)