从 cofree comonad 派生 monad

问题描述 投票:0回答:0

Edward Kmett 在他的博客 上写道,使用

Co
新类型(来自 kan-extensions 包),可以从任何 Comonad 派生出 Monad。我想学习如何对任何
Cofree f a
机械地执行此操作,至于某些 Cofree 类型,我不知道以一种万无一失的方式获取 monad 实例的不同方法。例如数据类型

data Tree a = Leaf a | Branch a (Tree a) (Tree a)

同构于

type Tree' = Cofree (Compose Maybe V2)    -- V2 from `linear` package

我发现这种类型很有趣,因为它不能被建模为一个 Free monad,而且也不是 Representable。我的理解是

Co Tree
也与 Tree 同构,并且有一个 monad 实例。 Phil Freeman 在他的
comonadic UI 库
中广泛使用了 Co,因此它一定很有用。虽然我可以玩俄罗斯方块类型来编写介于两种类型之间的函数,但我不确定这是否一定会导致正确的实现。

haskell category-theory
© www.soinside.com 2019 - 2024. All rights reserved.