适用于monad是什么X是comonad

时间:2016-01-17 10:08:09

标签: haskell monads applicative comonad

我们可以为X解决这个等式吗?

  

适用于monad是什么X是comonad

2 个答案:

答案 0 :(得分:8)

在考虑之后,我认为这实际上是一个落后的问题。有人可能会认为ComonadApplyComonad ApplicativeMonad的内容,但事实并非如此。但是要看到这一点,让我们使用PureScript的类型类层次结构:

class Functor f where
    fmap :: (a -> b) -> f a -> f b

class Functor f => Apply f where
    apply :: f (a -> b) -> f a -> f b -- (<*>)

class Apply f => Applicative f where
    pure :: a -> f a

class Applicative m => Monad m where
    bind :: m a -> (a -> m b) -> m b  -- (>>=)
 -- join :: m (m a) -> m a
 -- join = flip bind id

如您所见,ComonadApply仅仅是(Apply w, Comonad w) => w。但是,Applicative能够使用pure将值注入到仿函数中是真正的区别。

Comonad作为分类对偶的定义包含return的双extractbind的双重extend(或替代定义)通过duplicate作为join的双重身份):

class Functor w => Comonad w where
    extract   :: w a -> a        
    extend    :: (w a -> b) -> w a -> w b
 -- extend f  = fmap f . duplicate k
 -- duplicate :: w a -> w (w a)
 -- duplicate = extend id

因此,如果我们查看从ApplicativeMonad的步骤,则之间的逻辑步骤将是具有pure的双重类型的类型类:

class Apply w => Extract w where
    extract :: w a -> a

class Extract w => Comonad w where
    extend :: (w a -> b) -> w a -> w b

请注意,我们无法根据extractextend定义duplicate,也无法根据{{1}定义pure / return }或bind,所以这似乎是“逻辑”步骤。 join在这里几乎无关紧要;只要他们的法律成立,就可以为applyExtract定义:

Monad

所以applyC f = fmap $ extract f -- Comonad variant; needs only Extract actually (*) applyM f = bind f . flip fmap -- Monad variant; we need join or bind (获取值)是Extract Comonad(获取值)是ApplicativeMonad或多或少是一个幸福的小事故。 Hask中是否存在Apply但不是Extract(或Comonad但不是Extend的类型,见下文)会很有趣,但我想这些是相当的罕见的。

请注意,Comonad尚不存在。但是2010 report中的Extract也没有。此外,同时属于ApplicativeExtract的任何类型都是ApplicativeMonad,因为您可以定义Comonad和{{ 1}}就bindextend而言:

extract

*能够根据pure定义bindC :: Extract w => w a -> (a -> w b) -> w b bindC k f = f $ extract k extendM :: Applicative w => (w a -> b) -> w a -> w b extendM f k = pure $ f k 表示apply更可行,但可以将extract拆分为{ {1}}因此class Extend w => Comonad w进入Monad,所以它或多或少分裂了头发。

答案 1 :(得分:0)

对我来说,Populars类似乎根本不应该是图片的一部分。

例如,@ Zeta的答案中Apply的定义似乎行为不当。特别是,它总是丢弃第一个参数的上下文,而仅使用第二个参数的上下文。

直觉上,看来comonad是关于“分割”上下文而不是合并,因此“共同适用”应该是相同的。

这个问题似乎有更好的答案:Is there a concept of something like co-applicative functors sitting between comonads and functors?