在研究了基于MacLane,Awodey和Spivak书籍的类别理论之后,我试图了解Haskell中的免费/操作monad。
我们可以使用Control.Monad.Free
将Data.Functor.Coyoneda
转换为带有Data.Functor.Coyoneda
的仿函数,从而只使用数据类型获得monad,这是基于Yoneda引理的数学背景。
但我还没有完全理解,仿函数可以由GHC中的派生函数扩展自动生成,而不是依赖于Yoneda引理。
与sed -r 's/[0-9]/\n/2g;:a;s/(([0-9]).*)\n/\1\2/;ta' file
相比,在GHC中使用派生仿函数是否有任何限制?
答案 0 :(得分:8)
好问题!
Coyoneda
和DeriveFunctor
执行不同的操作。 Coyoneda
为任何参数选择创建一个新的独立数据类型,恰好是Functor
。 DeriveFunctor
只为自己的 仿函数的类型生成样板代码。您只能为可以手动编写此类实例的类型派生Functor
实例。
将newtype Pred a = Pred (a -> Bool)
作为一个(有点人为的)示例:没有instance Functor Pred
因为Pred
在a
参数中是逆变的,所以DeriveFunctor
赢了&# 39;能够帮助你。另一方面,Coyoneda Pred
是Functor
因为Coyoneda f
是Functor
,但对于任何f
来说都不是非常有用。
顺便说一下,Freer monad是Free
到Coyoneda
的应用。