Tree 标准ml从列表中生成bst

Tree 标准ml从列表中生成bst,tree,sml,binary-search-tree,currying,ml,Tree,Sml,Binary Search Tree,Currying,Ml,我想制作一个函数标准ml,它接受一个列表和函数,并从中生成一个BST。函数的类型是:'a list->('a*'a->bool)->'a tree,但我遇到了一些问题,下面是我编写的代码: datatype 'data tree = EMPTY | NODE of 'data tree * 'data * "data tree; fun makeBST [] f = EMPTY | makeBST (x::xs) f = let fun insert EM

我想制作一个函数标准ml,它接受一个列表和函数,并从中生成一个BST。函数的类型是:
'a list->('a*'a->bool)->'a tree
,但我遇到了一些问题,下面是我编写的代码:

datatype 'data tree = 
  EMPTY
| NODE of 'data tree * 'data * "data tree;

fun makeBST [] f = EMPTY
  | makeBST (x::xs) f = 
     let
        fun insert EMPTY x = NODE(EMPTY, x, EMPTY)
          | insert (NODE(left, root, right)) x = 
                if f(x, root) then
                    insert left x
                else
                    insert right x
     in 
        makeBST xs f
     end;

这个函数的类型是:
'a list->('b*'c->bool)->'d tree
当我尝试调用它时,就像下面的
makeBST[4,3,6,7,8,2,0,1](op代码的第一个版本有两个问题:

  • 您在let块中声明了一个从未使用过的函数,并且您的函数递归地调用自己,直到第一个参数为空列表,因此您的代码可以简化为
    fun makeBST\uu=empty
    ,因此这可能是您收到错误的原因,因为SML不知道
    empty
    是什么类型应该是
  • 第3行的双引号应为单引号
尽管如此,由于您已经制作了第二个版本,我猜您已经捕捉到了这一点。但是,您的新代码仍然不正确。对该函数的任何调用的结果都是一个树,其中列表的第一个元素是根,两个
子元素。您正在比较左子树和右子树,然后在右侧添加新值但问题是您只返回该子树,而不是整个树。您需要的是以下内容:

fun makeBST [] f = EMPTY
    | makeBST (x::xs) f = 
        let
            val tree = EMPTY
            fun insert EMPTY x = NODE (EMPTY, x, EMPTY)
              | insert (NODE(left, root, right)) x = 
                    if f(x, root) then
                        Node(insert left x, root, right)
                    else
                        Node(left, root, insert right x)
        in
            insert (makeBST xs f) x
        end;

您需要行
val tree=EMPTY
?这当然是韦伯现代编程语言第11章练习11中的教科书作业问题。
fun makeBST [] f = EMPTY
    | makeBST (x::xs) f = 
        let
            val tree = EMPTY
            fun insert EMPTY x = NODE (EMPTY, x, EMPTY)
              | insert (NODE(left, root, right)) x = 
                    if f(x, root) then
                        insert left x
                    else
                        insert right x
        in
            insert (makeBST xs f) x
        end;
fun makeBST [] f = EMPTY
    | makeBST (x::xs) f = 
        let
            val tree = EMPTY
            fun insert EMPTY x = NODE (EMPTY, x, EMPTY)
              | insert (NODE(left, root, right)) x = 
                    if f(x, root) then
                        Node(insert left x, root, right)
                    else
                        Node(left, root, insert right x)
        in
            insert (makeBST xs f) x
        end;