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
,因此它一定很有用。虽然我可以玩俄罗斯方块类型来编写介于两种类型之间的函数,但我不确定这是否一定会导致正确的实现。