在this answer中,“monad可以成为comonad吗?”我们看到了
Cofree上的Comonad Alternative functor每{...}}会产生一个Monad。
这对此有什么影响?是否有一类函子可以自动为它们创建一个免费的monad?
答案 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)继续是一个幺半群类别,但现在假设
然后我们可以定义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的类别的典型现象。