Sml 如何在标准ML中编写BST搜索函数?

Sml 如何在标准ML中编写BST搜索函数?,sml,Sml,需要编写一个类型为“a tree->”(“a*”a->bool)->“a->bool”的函数searchBST 在nst中搜索给定数据元素的。使用: datatype 'data tree = Empty | Node of 'data tree * 'data * 'data tree 此外,我们不能搜索树中的每个节点,而只能搜索那些根据定义可能包含我们正在查找的元素的节点 我编写的函数是(int*int-tree->bool)类型,如果您能提供将其

需要编写一个类型为“a tree->”(“a*”a->bool)->“a->bool”的函数searchBST 在nst中搜索给定数据元素的。使用:

datatype 'data tree = Empty 
                    | Node of 'data tree * 'data * 'data tree
此外,我们不能搜索树中的每个节点,而只能搜索那些根据定义可能包含我们正在查找的元素的节点

我编写的函数是
(int*int-tree->bool)
类型,如果您能提供将其转换为所需类型的提示,我将不胜感激

datatype 'data tree = Empty 
                    | Node of 'data tree * 'data * 'data tree;

fun searchBST (x, Empty) = false
  | searchBST (x, Node(l, parent, r)) =
      if x = parent then true 
      else 
       if x< parent then searchBST(x, l)
       else searchBST(x,r)
datatype'数据树=空
|“数据树*”数据*数据树的节点;
fun searchBST(x,空)=false
|searchBST(x,节点(l,父节点,r))=
如果x=父级,则为真
其他的
如果x
您的代码中缺少这一部分“(“a*”a->bool)”考虑到这一点,对元组进行处理,那么您的代码就可以工作了。两个“a”是您搜索的元素和节点中的元素

您的代码中缺少这一部分“('a*'a->bool)”考虑到这一点,对元组进行处理后,您的代码就可以工作了。两个“a”是您搜索的元素和节点中的元素

当某物的类型为
“a*”a->bool
时,它总是(99,9%的时候)一个谓词函数。参数tuple
“a*”a
是一种相等类型(因此是双标记,而不是单个标记为“正常”)这一事实强烈地暗示了这一点

因为您正在构造一个搜索函数,所以您的谓词函数很可能就是应该用来定义要搜索的元素的函数。 然而,它也可能定义了所需元素是在树的左侧还是右侧。虽然通常情况下,它会是一个排序函数,类型为
'a*'a->order
。这样的排序函数在任何实际情况下都会更好,因为这样您就能够抽象元素的排序(包括相等),而不是硬编码一个小于,这将迫使您的函数只处理整数(除非您键入annotate到其他一些数字类型,如reals)而不是
“a
(相等)值

因此,您不想(获得所需类型)的是以下形式:

fun searchBST t p x = 
其中,
t
是树,
p
是您的谓词函数,
x
是您无法找到的值。基本上,您缺少的是在测试中使用谓词函数,而不是直接执行它

fun searchBST Empty _ _ = false
  | searchBST (Node(l, d, r)) p x = 
     case (p(x, d), x < d) of
        (true, _) => true
      | (_, true) => searchBST l p x
      | (_, false) => searchBST r p x
fun searchBST Empty\u0=false
|searchBST(节点(l,d,r))px=
1例(p(x,d),x正确
|(u,true)=>searchBST l p x
|(u,false)=>searchBST r p x

当某个对象的类型为
''a*''a->bool
时,它总是(99,9%的时候)一个谓词函数。参数tuple
“a*”a
是一种相等类型(因此是双标记,而不是单个标记为“正常”)这一事实强烈地暗示了这一点

因为您正在构造一个搜索函数,所以您的谓词函数很可能就是应该用来定义要搜索的元素的函数。 然而,它也可能定义了所需元素是在树的左侧还是右侧。虽然通常情况下,它会是一个排序函数,类型为
'a*'a->order
。这样的排序函数在任何实际情况下都会更好,因为这样您就能够抽象元素的排序(包括相等),而不是硬编码一个小于,这将迫使您的函数只处理整数(除非您键入annotate到其他一些数字类型,如reals)而不是
“a
(相等)值

因此,您不想(获得所需类型)的是以下形式:

fun searchBST t p x = 
其中,
t
是树,
p
是您的谓词函数,
x
是您无法找到的值。基本上,您缺少的是在测试中使用谓词函数,而不是直接执行它

fun searchBST Empty _ _ = false
  | searchBST (Node(l, d, r)) p x = 
     case (p(x, d), x < d) of
        (true, _) => true
      | (_, true) => searchBST l p x
      | (_, false) => searchBST r p x
fun searchBST Empty\u0=false
|searchBST(节点(l,d,r))px=
1例(p(x,d),x正确
|(u,true)=>searchBST l p x
|(u,false)=>searchBST r p x

这大概是家庭作业。你应该使用家庭作业标签。大概,这是家庭作业。你应该使用家庭作业标签。