一位评论员最近表示:
自由单子是教堂数字——只是使用(endo-)函子而不是函数!
他继续解释这句话:
它们都是由 0 - n 次组成的 endofunct(ion|or)
我知道教堂数字是一组匿名函数组合,每个数字都有一个组合。我只是不明白这如何适用于 Free Monads。
我的问题是:自由单子是教堂数字吗?
有点。
教会数字的概括是数字n在f^n哪里f是某个类别中的自同态(域和共域是同一对象的箭头) ,f^n意思是“f与自身n时间组合”。普通的 Church 数字属于集合的类别,其中箭头是功能,因此例如数字3应用于fand xis 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))),一个由零个或多个fs组成的应用到x。
所以这并不是说“自由单子是教会数字”,而是自由单子是某个函子上的类型结构,而该函子上的教会数字嵌入在该类型中。