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

Pet*_*lák 12 monads haskell category-theory comonad free-monad

这个答案中"Monad可以成为一个comonad吗?" 我们看到了

每个Cofree Comonad对一个Alternative functor都会产生一个Monad.

什么是双重的?是否有一类函子可以自动为它们创建一个免费的monad?

Rei*_*ton 4

是的,你可以对结构进行对偶化,但是生成的类的唯一成员是空函子,其自由单子(身份单子)确实也是一个共单子。不是很令人兴奋。

\n\n

您所指的构造实际上只需要很少的时间,因此让我们放弃 Hask 的包袱并按以下一般性进行工作。让

\n\n
    \n
  • (C, \xe2\x8a\x97, 1) 是幺半群范畴

  • \n
  • F : C -> C 幺半群值函子,即存在映射 1 -> FX 和 FX \xe2\x8a\x97 FX -> FX 在 X 中是自然的,并且是单位和结合的

  • \n
\n\n

定义 TX = X \xe2\x8a\x97 F(TX)。假设这个递归定义在某种程度上是有意义的,我们可以对 T 进行递归定义。然后我们可以将 T 变成具有以下结构映射的 monad:

\n\n\n\n

当 \xe2\x8a\x97 是笛卡尔积时,此构造是您引用的替代函子上的自由 comonad 上的 monad 结构。事实上,替代结构的应用部分是无关紧要的。仅需要 Alternative 本身(加上 Functor)的类方法:一个幺半群值函子。从元素角度来说,构成上述连接的步骤由下式给出

\n\n
(x :< xs) :< xss  ->  (x :< xs, xss)\n                  ->  (x, xs, xss)\n                  ->  (x, xs, fmap join xss)\n                  ->  (x, xs <|> fmap join xss)\n                  ->  x :< (xs <|> fmap join xss)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
(a :< m) >>= k = case k a of\n                   b :< n -> b :< (n <|> fmap (>>= k) m)\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于我们最初的结构非常小,因此很容易对偶化。因此让 (C, \xe2\x8a\x97, 1) 继续是一个幺半群范畴,但现在假设

\n\n
    \n
  • G : C -> C 共类值函子,即存在 GX -> 1 和 GX -> GX \xe2\x8a\x97 GX 映射,它们在 X 中是自然的,并且是共关联的
  • \n
\n\n

然后我们可以定义 UX = X \xe2\x8a\x97 G(UX) (再次假设这在某种程度上是有意义的),并通过对偶结构为 U 配备一个共同的结构。从某种意义上说,这是这里的真正答案,但是为了解决您的具体问题,我们应该考虑 \xe2\x8a\x97 的某些具体选择会发生什么。

\n\n

首先假设 \xe2\x8a\x97 再次是笛卡尔积。然后每个函子 G 都以独特的方式具有共形值(共性迫使 GX -> GX x GX 成为对角线)。因此,对于任何函子 G,我们得到一个共同函数 UX = X x G(UX)。事实上,这只是函子构造上常见的 cofree comonad(证明你的口号中的“cofree comonad”部分是合理的;当 F 是幺半群值时,我们可以设置 G = F 并且 G 自动是 comonoid 值,然后 T和 U 具有相同的底层函子)。

\n\n

对偶地,如果 \xe2\x8a\x97 是余积 \xe2\xa8\xbf,则任何对 \xe2\xa8\xbf 具有共幺值的 G 也以独特的方式对 \xe2\xa8\xbf 具有幺幺值,因此UX = X \xe2\xa8\xbf G(UX) 也是 G 上的自由单子,也是一个共单子。

\n\n

但在 Hask 中,\xe2\xa8\xbf 的单位对象是空类型 0,并且 G 的单位应该具有类型 GX -> 0,只有当所有 X 的 GX = 0 时才有可能(这在任何笛卡尔封闭类别)。因此,Hask 中没有这种构造的有趣示例。这种缺乏对称性是类似于 Set 的范畴的典型现象。

\n