一位评论员最近表示:
自由单子是教堂数字——只是使用(endo-)函子而不是函数!
他继续解释这句话:
它们都是由 0 - n 次组成的 endofunct(ion|or)
我知道教堂数字是一组匿名函数组合,每个数字都有一个组合。我只是不明白这如何适用于 Free Monads。
我的问题是:自由单子是教堂数字吗?
有点。
教会数字的概括是数字n
在f^n
哪里f
是某个类别中的自同态(域和共域是同一对象的箭头) ,f^n
意思是“f
与自身n
时间组合”。普通的 Church 数字属于集合的类别,其中箭头是功能,因此例如数字3
应用于f
and x
is f(f(f(x)))
。例如,如果f(x) = x + 10
,那么3 f 0
是30
。
在类别的范畴中,箭头是函子。在那里,3
应用于某些函子f
和对象x
(例如,类型)的数字又是f(f(f(x)))
. 例如,如果f
是类型构造函数f x = Int => x
,那么3 f String
是Int => Int => Int => String
,接受三个Int
参数并返回 a的函数的类型String
。
现在,对于 functor f
,Free f
是由生成的自由 monadf
,其中类型的实例Free f x
只是 anx
或 an f (Free f x)
。所以它会有一个类型的表格f(f(f(...(x)))
,一个由零个或多个f
s组成的应用到x
。
所以这并不是说“自由单子是教会数字”,而是自由单子是某个函子上的类型结构,而该函子上的教会数字嵌入在该类型中。