【发布时间】:2018-02-04 14:57:14
【问题描述】:
据我所知,Haskell 的递归数据类型对应于 Hask 类别 [1, 2] 的内函子的初始代数。例如:
- 自然数
data Nat = Zero | Succ Nat对应于内函子F(-) = 1 + (-)的初始代数。 - 列表
data List a = Nil | Cons a (List a),对应于内函子F(A, -) = 1 + A × (-)的初始代数。
但是,我不清楚玫瑰树对应的内函子应该是什么:
data Rose a = Node a (List (Rose a))
让我感到困惑的是,有两种递归:一种用于玫瑰树,另一种用于列表。根据我的计算,我会得到以下仿函数,但似乎不对:
F(A, •, -) = A × (1 + (-) × (•))
或者,玫瑰树可以定义为相互递归的数据类型:
data Rose a = Node a (Forest a)
type Forest a = List (Rose a)
相互递归的数据类型在范畴论中有解释吗?
【问题讨论】:
-
当然,你可以写
RoseF(A,-) = A * List(-)whereList(A)= μ (ListF(A)),但我猜你正在寻找一个非递归代数。如果是这样,就没有这样的代数(在Set->Set中)。也许它存在于另一个类别中(考虑您的陈述:“有两个递归”)?这种缺乏非递归代数的性质使得类型non-regular(或non-uniform,或nested,也许还有其他......) .请注意,这与相互递归无关(Rose只是以一种微不足道的方式相互递归,因为Forest是身份)。 -
感谢 cmets,但我有点困惑,因为 this reference 表明玫瑰树是一种常规数据类型(“一种递归的参数化类型,其递归定义不涉及更改类型参数”)。
-
我寻找玫瑰树初始代数的动机是帮助我推导出玫瑰树的性质,例如折叠的普遍性质或融合定律。 @user2407038 在这方面,您基于递归代数的公式是否足够?
-
上面的类型确实是常规的(我看错了,首先——我删除了我的误导性cmets)。
-
您有 Jeremy Gibbons 加入 SO 来评论您的问题。你应该感到自豪。
标签: haskell recursion algebra algebraic-data-types category-theory