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中是自然的,统一的和关联的
- 单位由
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
(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中是天然的,并且是共价的和共价的
但在哈斯克,单位对象为⨿ 是空类型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)