每个monad都是适用的函子-概括为其他类别

时间:2018-12-27 16:39:36

标签: haskell categories functor applicative category-theory

我可以很容易地在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

我正在阅读this post,其中解释了一个适用的函子是松散的(封闭或单项)函子。它是根据(指数或单项的)双函子进行的。我知道在Haskell类别中,每个Monad都是Applicative;我们如何概括?从定义Applicative的角度来看,我们应该如何选择(指数或单项的)函子?令我感到困惑的是我们的Monad类似乎对(封闭或单项式)结构一无所知。

编辑:一个评论者说这通常是不可能的,所以现在我的问题的一部分是在哪里可能的。

2 个答案:

答案 0 :(得分:3)

  

令我困惑的是,我们的Monad类似乎对(封闭或单调)结构没有任何概念。

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

t :: Monad m => (a, m b) -> m (a,b)
t (x, my) = my >>= \y -> return (x,y) 

答案 1 :(得分:3)

本质上,单极子函子方法中涉及的所有单极子事物都发生在目标类别上。可以这样形式化

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的单面结构应通过以下方式映射到t的此单面结构中:函子。

也许更有见地的是将fmap纳入类方法中,因此很明显函子的“ 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,我们可以找回旧的 Has -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)

在这种情况下,也许更有趣的是另一个方向,因为这向我们展示了在一般情况下与单子的联系:

instance Applicative f => Monoidal (->) (->) f where
  pureUnit = pure
  fzip = \(xs,ys) -> liftA2 (,) xs ys
       = \(xs,ys) -> join $ map (\x -> map (x,) ys) xs

lambda和tuple部分在常规类别中不可用,但是可以是translated to cartesian closed categories


我正在将(,)作为两个单项类别中的乘积,并使用标识元素()。通常,您可以为产品及其各自的标识元素编写data I_sdata I_t以及type family (⊗) x ytype family (∙) x y