微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从SML转换为球拍无法正常运行的插入语句

如何解决从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,Leaf 38),2,Leaf 55),3,Node(Leaf 27,Leaf 96))

val tree1false =
  Node(Node(Node(Leaf 47,4,Leaf 96))

val tree2 =
  Node(Node(Leaf 55,Node(Leaf 47,Leaf 38)),Leaf 96))

val tree3 =
  Node(Node(Node(Leaf 47,Node(Leaf 55,Leaf 54)),Leaf 96))
       
fun insert newValue (Leaf n) = Node(Leaf newValue,Leaf n)
  | insert newValue (Node(left,l,r,right)) =
      if (l <= r)
        then (Node(insert newValue left,l + 1,right))
      else
        (Node(left,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)))))]

    ))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。