每个 monad 都是一个应用函子——泛化到其他类别
Every monad is an applicative functor — generalizing to other categories
我可以很容易地在 Haskell 中定义一般 Functor
和 Monad
classes:
class (Category s, Category t) => Functor s t f where
map :: s a b -> t (f a) (f b)
class Functor s s m => Monad s m where
pure :: s a (m a)
join :: s (m (m a)) (m a)
join = bind id
bind :: s a (m b) -> s (m a) (m b)
bind f = join . map f
我正在阅读 this post,其中解释了应用函子是松散(封闭或幺半群)函子。它是根据(指数或幺半群)双函子来实现的。我知道在 Haskell 类别中,每个 Monad
都是 Applicative
;我们如何概括?我们应该如何选择(指数或幺半群)函子来定义 Applicative
?令我困惑的是我们的 Monad
class 似乎对(封闭或幺半群)结构没有任何概念。
编辑:一位评论者说这通常不可能,所以现在我的部分问题是在什么地方可能。
What confuses me is our Monad class seems to have no notion whatsoever of the (closed or monoidal) structure.
如果我正确理解你的问题,那将通过 monad 的张量强度提供。 Monad
class 没有它,因为它是 Hask 类别的固有内容。更具体地说,假设是:
t :: Monad m => (a, m b) -> m (a,b)
t (x, my) = my >>= \y -> return (x,y)
本质上,幺半群函子方法中涉及的所有幺半群东西都发生在目标类别上。可以形式化为†:
class (Category s, Category t) => Functor s t f where
map :: s a b -> t (f a) (f b)
class Functor s t f => Monoidal s t f where
pureUnit :: t () (f ())
fzip :: t (f a,f b) (f (a,b))
s
-态射只有在你考虑幺半群函子的定律时才会出现,它粗略地说 s
的幺半群结构应该映射到 [=17= 的幺半群结构] 由仿函数。
也许更有见地的是将 fmap
分解为 class 方法,这样就清楚了仿函数的“func-”部分的作用:
class Functor s t f => Monoidal s t f where
...
puref :: s () y -> t () (f y)
puref f = map f . pureUnit
fzipWith :: s (a,b) c -> t (f a,f b) (f c)
fzipWith f = map f . fzip
从Monoidal
,我们可以找回我们的好旧Hask-Applicative
因此:
pure :: Monoidal (->) (->) f => a -> f a
pure a = puref (const a) ()
(<*>) :: Monoidal (->) (->) f => f (a->b) -> f a -> f b
fs <*> xs = fzipWith (uncurry ($)) (fs, xs)
或
liftA2 :: Monoidal (->) (->) f => (a->b->c) -> f a -> f b -> f c
liftA2 f xs ys = fzipWith (uncurry f) (xs,ys)
也许在这种情况下更有趣的是另一个方向,因为这向我们展示了在一般情况下与 monad 的联系:
instance Applicative f => Monoidal (->) (->) f where
pureUnit = pure
fzip = \(xs,ys) -> liftA2 (,) xs ys
= \(xs,ys) -> join $ map (\x -> map (x,) ys) xs
lambda 和元组部分在一般类别中不可用,但它们可以 translated to cartesian closed categories。
†我使用 (,)
作为两个幺半群类别中的产品,具有标识元素 ()
。更一般地说,您可以为产品及其各自的标识元素编写 data I_s
和 data I_t
以及 type family (⊗) x y
和 type family (∙) x y
。
我可以很容易地在 Haskell 中定义一般 Functor
和 Monad
classes:
class (Category s, Category t) => Functor s t f where
map :: s a b -> t (f a) (f b)
class Functor s s m => Monad s m where
pure :: s a (m a)
join :: s (m (m a)) (m a)
join = bind id
bind :: s a (m b) -> s (m a) (m b)
bind f = join . map f
我正在阅读 this post,其中解释了应用函子是松散(封闭或幺半群)函子。它是根据(指数或幺半群)双函子来实现的。我知道在 Haskell 类别中,每个 Monad
都是 Applicative
;我们如何概括?我们应该如何选择(指数或幺半群)函子来定义 Applicative
?令我困惑的是我们的 Monad
class 似乎对(封闭或幺半群)结构没有任何概念。
编辑:一位评论者说这通常不可能,所以现在我的部分问题是在什么地方可能。
What confuses me is our Monad class seems to have no notion whatsoever of the (closed or monoidal) structure.
如果我正确理解你的问题,那将通过 monad 的张量强度提供。 Monad
class 没有它,因为它是 Hask 类别的固有内容。更具体地说,假设是:
t :: Monad m => (a, m b) -> m (a,b)
t (x, my) = my >>= \y -> return (x,y)
本质上,幺半群函子方法中涉及的所有幺半群东西都发生在目标类别上。可以形式化为†:
class (Category s, Category t) => Functor s t f where
map :: s a b -> t (f a) (f b)
class Functor s t f => Monoidal s t f where
pureUnit :: t () (f ())
fzip :: t (f a,f b) (f (a,b))
s
-态射只有在你考虑幺半群函子的定律时才会出现,它粗略地说 s
的幺半群结构应该映射到 [=17= 的幺半群结构] 由仿函数。
也许更有见地的是将 fmap
分解为 class 方法,这样就清楚了仿函数的“func-”部分的作用:
class Functor s t f => Monoidal s t f where
...
puref :: s () y -> t () (f y)
puref f = map f . pureUnit
fzipWith :: s (a,b) c -> t (f a,f b) (f c)
fzipWith f = map f . fzip
从Monoidal
,我们可以找回我们的好旧Hask-Applicative
因此:
pure :: Monoidal (->) (->) f => a -> f a
pure a = puref (const a) ()
(<*>) :: Monoidal (->) (->) f => f (a->b) -> f a -> f b
fs <*> xs = fzipWith (uncurry ($)) (fs, xs)
或
liftA2 :: Monoidal (->) (->) f => (a->b->c) -> f a -> f b -> f c
liftA2 f xs ys = fzipWith (uncurry f) (xs,ys)
也许在这种情况下更有趣的是另一个方向,因为这向我们展示了在一般情况下与 monad 的联系:
instance Applicative f => Monoidal (->) (->) f where
pureUnit = pure
fzip = \(xs,ys) -> liftA2 (,) xs ys
= \(xs,ys) -> join $ map (\x -> map (x,) ys) xs
lambda 和元组部分在一般类别中不可用,但它们可以 translated to cartesian closed categories。
†我使用 (,)
作为两个幺半群类别中的产品,具有标识元素 ()
。更一般地说,您可以为产品及其各自的标识元素编写 data I_s
和 data I_t
以及 type family (⊗) x y
和 type family (∙) x y
。