如何使用递归数据类型在ML中创建函数

时间:2010-09-27 22:41:47

标签: recursion types ml

给定数据类型:

datatype bunch = One of int
               | Group of bunch list;
datatype 'ex bunch = NIL
                   | One of 'ex
                   | Group of 'ex * 'ex bunch;

如何设计函数,例如,返回此递归函数的总和。我理解如何定义递归函数以及如何使用它,但是我无法找到'ex如何在线更改数据类型堆或任何其他引用。

1 个答案:

答案 0 :(得分:0)

您的第二个定义使bunch数据结构多态,即它可以包含任何类型的数据。例如,Group (3, One 2)int bunchGroup ("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;

(在生产程序中,使用尾递归算法,这些函数应该以不太清晰但资源消耗较少的方式编写。)

由于束类型与列表几乎是同构的,因此您可以查看实现的标准列表库的来源以获得灵感。