Haskell 每一个自由单子超过一个???函子产生一个余子?

Haskell 每一个自由单子超过一个???函子产生一个余子?,haskell,monads,category-theory,free-monad,comonad,Haskell,Monads,Category Theory,Free Monad,Comonad,在《单子能成为科摩纳德吗?》中,我们看到了这一点 每超过一个产生一个单子 这有什么双重意义?有没有一类函子可以自动将它们上面的自由单子变成一个comonad?是的,你可以将构造对偶化,但结果类中唯一的成员是空函子,它的自由单子(身份单子)实际上也是一个comonad。不太刺激 您提到的构造实际上只需要很少的过程,所以让我们放弃Hask的包袱,按照下面的一般性工作。让 (C),⊗, 1) 是幺半群范畴 F:C->C是一个幺半群值函子,也就是说,有映射1->FX和FX⊗ FX->FX在X中是自然的

在《单子能成为科摩纳德吗?》中,我们看到了这一点

每超过一个产生一个单子


这有什么双重意义?有没有一类函子可以自动将它们上面的自由单子变成一个comonad?

是的,你可以将构造对偶化,但结果类中唯一的成员是空函子,它的自由单子(身份单子)实际上也是一个comonad。不太刺激

您提到的构造实际上只需要很少的过程,所以让我们放弃Hask的包袱,按照下面的一般性工作。让

  • (C),⊗, 1) 是幺半群范畴

  • F:C->C是一个幺半群值函子,也就是说,有映射1->FX和FX⊗ FX->FX在X中是自然的,统一的和关联的

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

  • 单位由

        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
    
什么时候⊗ 是笛卡尔积,这个结构是你提到的另一个函子上自由余元上的单子结构。事实上,替代结构的应用部分是不相关的。只需要Alternative本身的类方法(加上函子):一个幺半群值函子。元素方面,组成上述连接的步骤如下所示:

(x :< xs) :< xss  ->  (x :< xs, xss)
                  ->  (x, xs, xss)
                  ->  (x, xs, fmap join xss)
                  ->  (x, xs <|> fmap join xss)
                  ->  x :< (xs <|> fmap join xss)
因为我们最初的结构非常小,所以很容易二元化。那么让我们(C,⊗, 1) 继续是一个幺半类,但现在假设

  • G:C->C是一个comonoid值函子,即有映射GX->1和GX->GX⊗ GX在X中是天然的,并且是共价的和共价的
然后我们可以定义UX=X⊗ G(UX)(再次假设这在某种程度上是有意义的)并通过双重结构将U装备为comonad的结构。从某种意义上说,这是真正的答案,但是为了解决你的具体问题,我们应该考虑到一些具体的选择会发生什么。⊗.

首先假设⊗ 又是笛卡尔积。然后,每个函子G都以一种独特的方式进行共面赋值(共面性强制GX->GX-GX成为对角线)。对于任何函子G,我们得到一个comonad UX=xg(UX)。事实上,这只是函子构造上通常的余树余元(证明你的口号中的“余树余元”部分是正确的;当F是幺半群值时,我们可以设置G=F,G自动为余元值,然后T和U具有相同的底层函子)

双重如果⊗ 是副产品吗⨿ 然后是任意一个G,它的值为comonoidal⨿ 也是单倍体的值⨿ 以独特的方式,因此UX=X⨿ G(UX)也是G上的自由单子,也是一个comonad


但在哈斯克,单位对象为⨿ 是空类型0,并且G的condit应该具有类型GX->0,这只有当所有X的GX=0时才可能(在任何笛卡尔封闭类别中都是如此)。因此,在Hask中没有这种构造的有趣例子。这种对称性的缺乏是类似集合的范畴的一种典型现象。

猜测:
空::()->fa
:(fa,fa)->fa
--反转我们得到的箭头,
fa->,
fa->(fa,fa)
,这在Hask中不是最有用的东西,虽然在线性类型系统中它是有意义的。@luqui关于线性类型系统的最后一句话很有趣,你能详细说明一下吗?Alternative的逆变版本是。不过,我不知道该怎么做。不过,反变函子并不是免费应用的。@J.Abrahamson如果有基于反变函子的monad或comonad之类的东西,我会觉得很有意思。
(a :< m) >>= k = case k a of
                   b :< n -> b :< (n <|> fmap (>>= k) m)