单子和共子计算的定点

Bob*_*Bob 8 monads haskell scala comonad fixpoint-combinators

在 Haskell 中,给定一个 monad m,可以mfix :: (a -> m a) -> m a计算一元计算的定点。

对偶,给定一个 comonad w,可以cofix :: w (w a -> a) -> a计算 comonad 计算的定点。

现在假设我有一个程序,它同时使用 monadm和 comonad ,它们通过monad 相对于 monad 的w分配律相关联。distr :: w (m a) -> m (w a)是否可以将mfix和组合cofix成一个类型的函数来w (w a -> m a) -> m a计算单子和共子计算的固定点?

S.K*_*ers 0

是的,事实上,我们可以wmfix :: w (w a -> m a) -> m a用两种不同的方式来定义合理;一个从 开始cofix,另一个从 开始mfix

如果我们对这两种方法进行标准化,它们的想法大致相同:将一些转换f : w (w a -> m a)为合适的,获取固定点,然后从 中b -> b挖掘出。对于类似的方法,我们可以采取m abcofix

wmfix1 f = cofix (fmap ((. distr) . (=<<)) f)
Run Code Online (Sandbox Code Playgroud)

或直接

wmfix1 f = extract (fix g) where
    g :: w (m a) -> w (m a)
    g = extend (\x -> distr x >>= extract f)
Run Code Online (Sandbox Code Playgroud)

如果我们从mfix相反开始,我们得到

wmfix2 f = fmap extract (extract (fmap (mfix . (distr .)  . extend) f))
Run Code Online (Sandbox Code Playgroud)

或者

wmfix2 f = fmap extract (fix h) where
    h :: m (w a) -> m (w a)
    h = (distr . extend (extract f) =<<)
Run Code Online (Sandbox Code Playgroud)

不幸的是,看起来这些总体上并不相同,这需要像这样的条件

fmap extract (distr (extend f x)) = f x
Run Code Online (Sandbox Code Playgroud)

这个条件似乎确实适用于w = NonEmpty, m = Maybe你提到的情况。

  • 好吧,并不是说你不能,但你不会期望需要它;如果“fix”是一个裸固定点,那么“mfix”和“cofix”是“进入”某个结构的固定点,因此“wmfix”在道德上“只是”一个同时进入两个结构的固定点,而不是一个固定点。固定点的固定点。我们还期望,如果“m”或“w”是“Identity”,那么“wmfix”应该减少为“cofix”或“mfix”,它现在就这样做(前提是条件),但如果您同时使用两者,您将剩下两个“修复” (2认同)