所需要的是编写''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)
答案 0 :(得分:2)
当某些内容具有''a * ''a -> bool
类型时,它始终是(99.9%的时间)谓词函数。由于参数元组''a * ''a
是一个相等类型(因此是双重标记,而不是单个标记为“正常”)这一事实强烈暗示了这一点。
由于您正在构建搜索功能,因此您的谓词函数很可能是应该用于定义要搜索的元素的函数。
然而,也可能是它定义所需元素是否在树的左侧或右侧部分的情况。虽然通常它会是类型为''a * ''a -> order
的排序函数。这样的排序函数在任何实际情况下都会更好,因为你可以抽象出元素的排序(包括相等)而不是硬编码小于,这会强制你的函数只对整数有效(除非您键入注释到其他数字类型(如实数)而不是''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
答案 1 :(得分:1)
您的代码中缺少此部分“(''*''a - &gt; bool)”考虑到它,处理元组然后您的代码将起作用。两个''是你搜索的元素和节点中的元素。