每个monad都是一个applicative functor - 推广到其他类别

M F*_*yck 6 haskell functor categories category-theory applicative

我可以很容易地在Haskell中定义一般FunctorMonad类:

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
Run Code Online (Sandbox Code Playgroud)

我正在阅读这篇文章,它解释了一个应用函子是一个松散(封闭或幺半)的仿函数.它是在(指数或幺半群)bifunctor方面这样做的.我知道在Haskell类别中,每一个Monad都是Applicative; 我们如何概括?我们应该如何选择(指数或幺半群)仿函数来定义Applicative?令我感到困惑的是,我们的Monad班级似乎没有任何关于(闭合或幺半)结构的概念.

编辑:评论者说通常不可能,所以现在问题的一部分是可能的.

Jor*_*ano 3

让我困惑的是我们的 Monad 类似乎没有任何(封闭或幺半群)结构的概念。

如果我正确理解你的问题,那将通过单子的张量强度提供。该类Monad没有它,因为它是Hask类别所固有的。更具体地说,假设为:

t :: Monad m => (a, m b) -> m (a,b)
t (x, my) = my >>= \y -> return (x,y) 
Run Code Online (Sandbox Code Playgroud)