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计算单子和共子计算的固定点?
是的,事实上,我们可以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你提到的情况。