每个免费的monad超过???仿函数产生一个comonad?

时间:2015-08-31 18:58:33

标签: haskell monads category-theory free-monad comonad

this answer中,“monad可以成为comonad吗?”我们看到了

  

Cofree上的Comonad Alternative functor每{...}}会产生一个Monad。

这对此有什么影响?是否有一类函子可以自动为它们创建一个免费的monad?

1 个答案:

答案 0 :(得分:4)

是的,你可以将构造二元化,但结果类的唯一成员是空的仿函数,其自由monad(身份monad)确实也是一个comonad。不是很令人兴奋。

你所指的建筑实际上需要的却很少,所以让我们放弃Hask的包袱并按照以下的一般性进行工作。让

  • (C,⊗,1)为幺半群类别

  • F:C - > C是一个幺正值的仿函数,也就是说,有地图1 - > FX和FX⊗FX - >在X中是自然的FX,以及单位和关联的

定义TX =X⊗F(TX)。假设这个递归定义在某种程度上有意义,我们可以在T上进行递归定义。然后我们可以使用以下结构映射将T转换为monad:

  • 给出的单位
        X = X ⊗ 1
         -> X ⊗ F(TX)            [unit map of F]
          = TX
    
  • 提供加入
    T(TX) = TX ⊗ F(TTX)
          = X ⊗ F(TX) ⊗ F(TTX)
         -> X ⊗ F(TX) ⊗ F(TX)    [join recursively under F]
         -> X ⊗ F(TX)            [multiplication of F]
          = TX
    

当⊗是笛卡儿积时,这个结构就是你所引用的另类仿函数上的免费comonad上的monad结构。事实上,Alternative结构的应用部分是无关紧要的。只需要Alternative本身的类方法(加上Functor):一个幺冒值的仿函数。从元素方面来说,如上所述构成连接的步骤由

给出
(x :< xs) :< xss  ->  (x :< xs, xss)
                  ->  (x, xs, xss)
                  ->  (x, xs, fmap join xss)
                  ->  (x, xs <|> fmap join xss)
                  ->  x :< (xs <|> fmap join xss)

这很容易看出(通过设置k = id)来同意

(a :< m) >>= k = case k a of
                   b :< n -> b :< (n <|> fmap (>>= k) m)

由于我们的初始结构非常小,因此很容易实现二元化。所以让(C,⊗,1)继续是一个幺半群类别,但现在假设

  • G:C - &gt; C a comonoid-valued functor,也就是说,有地图GX - &gt; 1和GX - &gt; GX⊗GX在X中是自然的,并且是指向和协作的

然后我们可以定义UX =X⊗G(UX)(再次假设这在某种程度上是有意义的)并且通过双重结构为U配备了comonad的结构。从某种意义上说,这是一个真正的答案,但为了解决你的具体问题,我们应该考虑一下some的具体选择会发生什么。

首先假设⊗再次是笛卡尔积。然后,每个仿函数G以独特的方式进行共生值(对立性力GX - > GX x GX为对角线)。因此对于任何算子G,我们得到一个comonad UX = X x G(UX)。事实上,这只是关于仿函数构造的通常的cofree comonad(证明你的口号中的“cofree comonad”部分;当F是幺正值时我们可以设置G = F并且G是自动的共价值,然后是T和U有相同的底层函子。)

如果⊗是副产品D那么,那么任何对于com为com的符号值的G也是以独特的方式为⨿的幺正值,因此UX =X⨿G(UX)也是G上的自由monad作为一个comonad。

但是在Hask中,⨿的单位对象是空类型0,而G的区域应该具有类型GX - &gt; 0,只有当所有X的GX = 0时才有可能(在任何笛卡尔闭合类别中都是如此)。因此,在Hask中没有这种结构的有趣例子。缺乏对称性是类似于Set的类别的典型现象。