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


我想写一个光滑的代码(节省我很多时间来实现其他) 绑结。它大致是这样的,

n <- myinstr n x

在理论上, myinstr 应该运行 x 得到一个价值,这将成为 nmyinstr,在里面运行 State monad,会放 n 进入状态,但这并不影响 x的计算。

我试过用过 DoRec 并且实现了 mfix

instance Monad             

12380
2017-12-05 00:41


起源



答案:


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


14
2017-12-05 03:21



有趣的是,它适用于所有的comonad,但是他们担心的问题非常少。 = / - Edward KMETT
我希望我能做到 IO MonadFix的一个实例。 - John L
@JohnL听起来像是时间旅行。 :) - augustss
@JohnL:我在这里参加派对已经很晚了,但IO已经是MonadFix的一个实例。你的意思是什么? - Levent Erkok
@LeventErkok:不,我只是感到遗憾的是,没有各种令人不满意的原语就无法做到(即 unsafe{Perform|Interleave}IO)。或者,正如奥古斯特有用地指出的那样,时间旅行。 - John L


答案:


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


14
2017-12-05 03:21



有趣的是,它适用于所有的comonad,但是他们担心的问题非常少。 = / - Edward KMETT
我希望我能做到 IO MonadFix的一个实例。 - John L
@JohnL听起来像是时间旅行。 :) - augustss
@JohnL:我在这里参加派对已经很晚了,但IO已经是MonadFix的一个实例。你的意思是什么? - Levent Erkok
@LeventErkok:不,我只是感到遗憾的是,没有各种令人不满意的原语就无法做到(即 unsafe{Perform|Interleave}IO)。或者,正如奥古斯特有用地指出的那样,时间旅行。 - John L