gpt4 book ai didi

haskell - Applicative 是 monad 就像 X 是 comonad

转载 作者:行者123 更新时间:2023-12-03 20:23:29 36 4
gpt4 key购买 nike

我们可以为 X 解这个方程吗?

Applicative is to monad what X is to comonad

最佳答案

经过一番思考,我认为这实际上是一个落后的问题。有人可能会认为 ComonadApply Comonad什么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 将值注入(inject)仿函数的能力是真正的区别。
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

因此,如果我们查看 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根据 extendduplicate ,我们也不能定义 pure/ return根据 bindjoin ,所以这似乎是“合乎逻辑”的步骤。 apply在这里几乎无关紧要;它可以定义为 ExtractMonad ,只要他们的法律成立:
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 . Apply或多或少是一个快乐的小意外。 Hask 中是否存在具有 Extract 的类型会很有趣。 ,但不是 Comonad (或 Extend 但不是 Comonad ,见下文),但我想这些是相当罕见的。

请注意 Extract尚不存在。但是 Applicative 也没有。在 2010 report .此外,任何同时是 Extract 实例的类型和 Applicative自动是 MonadComonad , 因为你可以定义 bindextend根据 extractpure :
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根据 extractclass Extend w => Comonad w 的标志可能更可行,但可以拆分 Monad进入 class (Applicative f, Bind f) => Monad f因此 Comonad进入 (Extend w, Extract w) => Comonad w ,所以它或多或少会 split 头发。

关于haskell - Applicative 是 monad 就像 X 是 comonad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34837150/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com