我们可以为X解决这个等式吗?
适用于monad是什么X是comonad
答案 0 :(得分:8)
在考虑之后,我认为这实际上是一个落后的问题。有人可能会认为ComonadApply
是Comonad
Applicative
到Monad
的内容,但事实并非如此。但是要看到这一点,让我们使用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
的双extract
和bind
的双重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
因此,如果我们查看从Applicative
到Monad
的步骤,则之间的逻辑步骤将是具有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
请注意,我们无法根据extract
或extend
定义duplicate
,也无法根据{{1}定义pure
/ return
}或bind
,所以这似乎是“逻辑”步骤。 join
在这里几乎无关紧要;只要他们的法律成立,就可以为apply
或Extract
定义:
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
(获取值)是Applicative
。 Monad
或多或少是一个幸福的小事故。 Hask中是否存在Apply
但不是Extract
(或Comonad
但不是Extend
的类型,见下文)会很有趣,但我想这些是相当的罕见的。
请注意,Comonad
尚不存在。但是2010 report中的Extract
也没有。此外,同时属于Applicative
和Extract
的任何类型都是Applicative
和Monad
,因为您可以定义Comonad
和{{ 1}}就bind
和extend
而言:
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?。