【问题标题】:How to create a function in ML using a Recursive Datatype如何使用递归数据类型在 ML 中创建函数
【发布时间】:2011-04-18 00:44:42
【问题描述】:

给定数据类型:

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

我如何设计一个函数,例如,返回这个递归函数的总和。我了解如何定义递归函数以及稍微了解如何使用它,但我找不到关于 'ex 如何在线更改数据类型群或我的任何其他参考资料的指示。

【问题讨论】:

    标签: recursion types ml


    【解决方案1】:

    您的第二个定义使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;
    

    (在生产程序中,应该使用尾递归算法以不太清晰但不占用资源的方式编写此类函数。)

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

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2011-12-04
      • 2012-09-19
      • 1970-01-01
      • 2017-07-08
      • 2022-01-21
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多