在学习了基于MacLane,Awodey和Spivak书籍的范畴理论之后,我试图理解Haskell中的自由/操作monad。
我们可以通过使用Data.Functor.Coyoneda
将数据类型转换为函数式,然后使用Control.Monad.Free
从数据类型中获得monad,这是基于名为Yoneda引理的数学背景。
但我并不完全理解函子可以由GHC中的派生函子扩展自动生成,而不是依赖于Yoneda引理。
与Data.Functor.Coyoneda
相比,在GHC中使用派生函数有什么限制吗?
发布于 2016-06-06 02:20:13
问得好!
Coyoneda
和DeriveFunctor
做不同的事情。Coyoneda
创建了一个新的、独立的数据类型,该数据类型恰好是任何参数选择的Functor
。DeriveFunctor
只是为类型生成样板代码,而这些类型本身就是函数式的。您只能为可以手动编写此类实例的类型派生Functor
实例。
以newtype Pred a = Pred (a -> Bool)
为例(有点人为的):没有instance Functor Pred
,因为Pred
的a
参数是逆变量,所以DeriveFunctor
不能帮助您。另一方面,Coyoneda Pred
之所以是Functor
,是因为Coyoneda f
对于任何f
都是一个Functor
,尽管它不是一个非常有用的any。
顺便说一句,Freer monad是作为Free
对Coyoneda
的应用而出现的。
https://stackoverflow.com/questions/37648366
复制