首页 > 解决方案 > 从 SML 转换为球拍的插入语句不起作用

问题描述

我已经非常深入地学习了 SML,并且了解了球拍和 SML 之间的相似之处,我现在正在尝试将我过去的一些 sml 项目转换为球拍,这个涉及二叉树。

在 SML 中,我尝试转换为 Racket 的以下二叉树和函数如下:

datatype 'a bin_tree = 
    Leaf of 'a
  | Node of 'a bin_tree    (* left tree *)
           * int           (* size of left tree *)
           * int           (* size of right tree *)
           * 'a bin_tree   (* right tree *)

val tree1 =
  Node(Node(Node(Leaf 47, 1, 1, Leaf 38),
            2,1,
            Leaf 55),
       3,2,
       Node(Leaf 27, 1, 1, Leaf 96))

val tree1false =
  Node(Node(Node(Leaf 47, 1, 1, Leaf 38),
            2,1,
            Leaf 55),
       4,2,
       Node(Leaf 27, 1, 1, Leaf 96))

val tree2 =
  Node(Node(Leaf 55,
            1,2,
            Node(Leaf 47, 1, 1, Leaf 38)),
       3,2,
       Node(Leaf 27, 1, 1, Leaf 96))

val tree3 =
  Node(Node(Node(Leaf 47, 1, 1, Leaf 38),
            2,2,
            Node(Leaf 55, 1, 1, Leaf 54)),
       4,2,
       Node(Leaf 27, 1, 1, Leaf 96))
       
fun insert newValue (Leaf n) = Node(Leaf newValue, 1, 1, Leaf n)
  | insert newValue (Node(left, l, r, right)) =
      if (l <= r)
        then (Node(insert newValue left, l + 1, r, right))
      else
        (Node(left, l, r + 1, insert newValue right));

在 SML 中,上述所有功能均正常运行,在球拍中,除插入物外,所有功能均正常运行,请帮助:

#lang racket

(provide Leaf)
(provide Node)

(provide size)
(provide verify)
(provide imbalances)
(provide insert)

(provide test1)
(provide test1false)
(provide test2)
(provide test3)

(struct Leaf (content))
(struct Node (left lsize rsize right))

(define test1
  (Node (Node (Node (Leaf 47) 1 1 (Leaf 38))
              2 1
              (Leaf 55))
         3 2
         (Node (Leaf 27) 1 1 (Leaf 96))))

(define test1false
  (Node (Node (Node (Leaf 47) 1 1 (Leaf 38))
              2 1
              (Leaf 55))
         4 2
         (Node (Leaf 27) 1 1 (Leaf 96))))

(define test2
  (Node (Node (Leaf 55)
              1 2
              (Node (Leaf 47) 1 1 (Leaf 38)))
        3 2
        (Node (Leaf 27) 1 1 (Leaf 96))))

(define test3 
  (Node (Node (Node (Leaf 47) 1 1 (Leaf 38))
               2 2
              (Node (Leaf 55) 1 1 (Leaf 54)))
         4 2
        (Node (Leaf 27) 1 1 (Leaf 96))))

(define (insert x tree)
    (cond
        [(Leaf? tree) 0]
        [(Node? tree) (<= (Node-lsize tree) (Node-rsize tree)) (Node ((insert x (Node-left tree)) (+ (Node-lsize tree) 1) (Node-rsize tree) (Node-right tree)))]
        [else (Node ((Node-left tree)  (Node-lsize tree) (+ (Node-rsize tree) 1) ((insert x (Node-right tree)))))]

    ))

标签: racketcomputer-sciencesml

解决方案


推荐阅读