我正在课堂学习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);
我现在面临的问题是:
whichTree
不包含which
类型。我不知道如何解决这个问题。whichSearch
的{{1}}函数,但它是whichTree -> int -> bool
,正在努力弄清楚如何解决问题。我不确定如何解决这个问题,因为我必须在int * whichTree -> bool
中为i
指定一个值来搜索。我正在寻找这个,但任何提示都会很棒。有人可以帮忙吗?如果有的话谢谢你!感谢那些已经回复的人。
答案 0 :(得分:3)
根据你的想法,我想我应该在标准ML语言中指出一些你正在打破的规则,我希望这会使你更容易处理:
您介绍的每个名称,无论是类型,函数还是变量,都只能意味着一件事(只要它们在程序的同一范围内)。
which
,然后用相同的名称定义一个函数,从而解决这个问题。whichTree
,然后使用相同的名称定义另一种数据类型来打破它。STRING
和INT
)在第3行打破它。请记住,当您使用这些datatype
声明时,您不仅要定义类型名称,还要定义类型的构造函数。如果你想引入一个带有两个参数的数据类型构造函数,看起来好像你想在第3行做的那样,你应该在类型之间使用星号*
,而不是箭头运算符{ {1}}。
我也同意Victor的观点,你应该从概念上概括地考虑二叉树实际上是什么。然后将其转换为Standard-ML。
在重写问题代码后进行编辑:您的新代码要好得多。正如你所指出的那样,你现在有两个问题:
如何使树成为->
值的树?那么,您的树目前是which
值的树,所以您应该更改int
的{{1}}是否有意义?但是您还声明您的树数据类型应该是“包含类型值的二叉树”,其中“数据仅位于树的叶子处”。这与您当前编码的内容不同,后者在每个非叶节点上保留int
。非叶节点由数据类型声明中的递归情况确定,而叶节点由非递归情况确定。
类型which
的函数(其中A,B和C是类型)可以重写为int
类型。两者都在Standard-ML中有效且可用,但第二种形式通常在函数式编程语言中是首选,因为它允许称为“强> currying 的技术,这意味着”部分函数应用“。要进行更改,您基本上以不同的方式编写参数:而不是(A * B) -> C
,而是编写A -> B -> C
- 您定义函数的位置以及使用它的位置。
请注意,我建议您稍后处理第2点,首先关注如何使数据类型正确并获得有效的搜索功能,然后您可以在知道其正确的情况下更改其类型。
答案 1 :(得分:1)
忘记ML。使用笔和纸(或标记和白板),您能解释如何在叶子中包含您的数据的二叉树是什么样的?您能否广泛解释如何在树中搜索元素? (提示:搜索需要通过决定是向左还是向右遍历节点,因此需要在树节点中保留一些信息以帮助搜索算法决定)。
一旦你将表示和算法设置为英语句子,将它们翻译成SML将会更容易。