实例定义为
instance MonadFix [] where
mfix f = case fix (f . head) of
[] -> []
(x:_) -> x : mfix (tail . f)但是,我没有理解它背后的直觉意义,对于被视为非确定性计算的[] monad来说。在mfix f函数中,f的参数不能严格,因此不能检查参数。而且根据定义,它也不能在输出的任何地方使用参数,否则在某个时候会碰到fix (f . head)和发散。那么,除了mfix之外,mfix (const someList)对列表有什么用处(或好的例子)吗?
发布于 2016-07-03 13:59:52
这样说可能是最简单的。完全定义了f的函数mfix f是指f x的脊柱不依赖于x的函数,因此它们可以用形式编写。
f x = [f1 x, ..., fn x]对于一些n (可能无穷大)和一些f1,.,fn。然后
mfix f = [fix f1, ..., fix fn](当然,要真正完全定义这一点,还必须定义每个fix fi )。
mfix可以被认为是非确定性的,给出了非确定性函数的不动点。比较严重的限制是非确定性计算的形状不能以任何方式依赖于输入。为了开始计算,我们似乎需要对计算进行某种限制,但您可能希望至少能够有条件地关闭计算的一个分支(例如,如果某些中间计算为负数)。我一直认为用这种方式使用mfix应该是可能的,方法是使用不同的非确定性monad,它的选择操作不是关联的,但从未计算出细节。
https://stackoverflow.com/questions/38168764
复制相似问题