标准ML二叉树类型

时间:2010-11-02 16:55:26

标签: types tree sml

我正在课堂学习ML,我遇到了一个我坚持的作业问题。我昨天整天都在寻找,但收效甚微,我们在课堂上没有谈到这个,所以我希望你们能帮助我。

我们得到了:

datatype which = STRING of string | INT of int

第1部分。我们被告知需要为包含类型whichTree的值的二叉树创建另一个名为which的数据类型,其中数据仅位于树的叶子处。

第2部分。我们需要创建一个whichSearch函数,类型whichTree -> int -> bool根据int是否在树中返回true或false。

这是我到目前为止所做的:

datatype which = STRING of string | INT of int;
datatype whichTree = Empty | Node of int*whichTree*whichTree;

val t1 = Node(6, Node(4,Empty,Empty), Node(15, Node(11,Empty,Empty), Node(24,Empty,Empty)));
val t2 = Node(157,Empty,Empty);
val t3 = Node(102,t1,t2);

fun whichSearch (i, Empty) = false
| whichSearch (i, Node(entry, left, right)) =
    if i = entry then true
    else whichSearch (i, left)
    orelse whichSearch (i, right);

我现在面临的问题是:

  1. 我的whichTree不包含which类型。我不知道如何解决这个问题。
  2. 我应该拥有类型为whichSearch的{​​{1}}函数,但它是whichTree -> int -> bool,正在努力弄清楚如何解决问题。我不确定如何解决这个问题,因为我必须在int * whichTree -> bool中为i指定一个值来搜索。我正在寻找这个,但任何提示都会很棒。
  3. 有人可以帮忙吗?如果有的话谢谢你!感谢那些已经回复的人。

2 个答案:

答案 0 :(得分:3)

根据你的想法,我想我应该在标准ML语言中指出一些你正在打破的规则,我希望这会使你更容易处理:

  • 您介绍的每个名称,无论是类型,函数还是变量,都只能意味着一件事(只要它们在程序的同一范围内)。

    • 首先定义一个数据类型which,然后用相同的名称定义一个函数,从而解决这个问题。
    • 您也可以通过先定义数据类型whichTree,然后使用相同的名称定义另一种数据类型来打破它。
    • 你实际上也通过引入已经在第一行引入的两个新数据类型构造函数(STRINGINT)在第3行打破它。请记住,当您使用这些datatype声明时,您不仅要定义类型名称,还要定义类型的构造函数。
  • 如果你想引入一个带有两个参数的数据类型构造函数,看起来好像你想在第3行做的那样,你应该在类型之间使用星号*,而不是箭头运算符{ {1}}。

我也同意Victor的观点,你应该从概念上概括地考虑二叉树实际上是什么。然后将其转换为Standard-ML。


在重写问题代码后进行编辑:您的新代码要好得多。正如你所指出的那样,你现在有两个问题:

  1. 如何使树成为->值的树?那么,您的树目前是which值的树,所以您应该更改int的{​​{1}}是否有意义?但是您还声明您的树数据类型应该是“包含类型值的二叉树”,其中“数据仅位于树的叶子处”。这与您当前编码的内容不同,后者在每个非叶节点上保留int。非叶节点由数据类型声明中的递归情况确定,而叶节点由非递归情况确定。

  2. 类型which的函数(其中A,B和C是类型)可以重写为int类型。两者都在Standard-ML中有效且可用,但第二种形式通常在函数式编程语言中是首选,因为它允许称为“强> currying 的技术,这意味着”部分函数应用“。要进行更改,您基本上以不同的方式编写参数:而不是(A * B) -> C,而是编写A -> B -> C - 您定义函数的位置以及使用它的位置。

  3. 请注意,我建议您稍后处理第2点,首先关注如何使数据类型正确并获得有效的搜索功能,然后您可以在知道其正确的情况下更改其类型。

答案 1 :(得分:1)

忘记ML。使用笔和纸(或标记和白板),您能解释如何在叶子中包含您的数据的二叉树是什么样的?您能否广泛解释如何在树中搜索元素? (提示:搜索需要通过决定是向左还是向右遍历节点,因此需要在树节点中保留一些信息以帮助搜索算法决定)。

一旦你将表示和算法设置为英语句子,将它们翻译成SML将会更容易。