您的第二个定义使bunch 数据结构多态,即它可以包含任何类型的数据。例如,Group (3, One 2) 是 int bunch,Group ("three", One "two") 是 string bunch。值NIL 的类型为'a bunch,其中'a 代表任何类型(即NIL 的类型为int bunch,类型为string bunch 和...)。
您“返回此递归函数的总和”的目标没有意义:您没有递归函数。如果您的意思是“返回此归纳数据结构的总和”,那么您仍然不清楚您想要什么,对于不是数字集合的数据结构,您需要更准确地了解总和的含义。
以下函数计算int bunch 中整数的总和。正如你在 ML 解释器中输入它所看到的,它的类型是 int bunch -> int,也就是说,它只能作用于整数串(否则 + 运算符没有意义)。
fun bunch_sum NIL = 0
| bunch_sum (One x) = x
| bunch_sum (Group (x, b)) = x + bunch_sum b;
下面的函数计算任何元素类型(如其类型'a bunch -> int 所示)中的元素数量。你可以定义这样一个多态函数的原因是它不需要查看一堆元素的内部来操作:它是参数多态的。
fun bunch_count NIL = 0
| bunch_count (One x) = 1
| bunch_count (Group (x, b)) = 1 + bunch_count b;
(在生产程序中,应该使用尾递归算法以不太清晰但不占用资源的方式编写此类函数。)
由于束类型几乎与列表同构,您可以查看实现的标准列表库的来源以获得灵感。