Functional programming 在Scheme中定义新的数据类型

Functional programming 在Scheme中定义新的数据类型,functional-programming,scheme,algebraic-data-types,Functional Programming,Scheme,Algebraic Data Types,我首先需要提到的是,我对Scheme还很陌生,因此,下面的问题可能没有太多意义 在学校,我们定义了代数数据类型,通常有一个空构造函数和一些内部/外部构造函数 在这个特殊的例子中,我感兴趣的是创建一个BTree二叉树类型(可能是平衡的,在未来的迭代中),我想知道Haskell如何对待构造函数。例如,我以前见过如何在Scheme中实现树,但这不是我想要的 我不想只是在列表周围做一个包装。我只是想写一些像: nil: -> BTree node: BTree x T x BTree ->

我首先需要提到的是,我对Scheme还很陌生,因此,下面的问题可能没有太多意义

在学校,我们定义了代数数据类型,通常有一个空构造函数和一些内部/外部构造函数

在这个特殊的例子中,我感兴趣的是创建一个
BTree
二叉树类型(可能是平衡的,在未来的迭代中),我想知道Haskell如何对待构造函数。例如,我以前见过如何在Scheme中实现树,但这不是我想要的

我不想只是在列表周围做一个包装。我只是想写一些像:

nil: -> BTree
node: BTree x T x BTree -> BTree
然后让它知道我的意思:

flattenTree: BTree -> List
然后,我将其定义为(假设定义了
):


此外,我欢迎建议正确缩进我的方案代码。。。(请修改)

在Scheme中表示二叉树(和大多数其他数据结构)的标准方法是。Scheme的一些实现提供了一种工具来定义C结构样式中的新数据类型。在(现在的Racket)中,新的二叉树数据类型可以定义为:

(define-struct btree (key left right))
环境将自动为新结构创建构造函数、访问器和mutator过程

> (define tree (make-btree 1 null null))
> (btree-key tree)
=> 10
> (set-btree-key! tree 10)
在此基础结构之上,您可以定义操纵btree的其他过程:

(define (btree-insert! t key)
  (if (< key (btree-key t))
      (if (null? (btree-left t))
          (set-btree-left! t (make-btree key null null))
          (btree-insert (btree-left t) key))
      (if (null? (btree-right t))
          (set-btree-right! t (make-btree key null null))
          (btree-insert (btree-right t) key))))

(define (btree-flatten t)
  (define (flatten t result)
    (if (not (null? t))
        (begin
          (append result (append (flatten (btree-left t) ()) 
                                 (list (btree-key t)))
                  (flatten (btree-right t) ())))
        t))
  (flatten t ()))

;; test

> (define tree (make-btree 10 null null))
> (btree-insert! tree 12)
> (btree-insert! tree 9)
> (btree-insert! tree 8)
> (btree-insert! tree 15)
> (btree-flatten tree)
=> (8 9 10 12 15)
(定义(btree insert!t键)
(如果(<键(btree键t))
(如果为空(b树左t))
(设置btree left!t(使btree键为null))
(btree插入键(btree左t键))
(如果为空(B右t))
(将btree设置为右侧!t(使btree键为null))
(btree插入(btree右t键)))
(定义(B树展平t)
(定义(展平t结果)
(如果(不是(空?t))
(开始
(追加结果(追加(展平(树左t)()
(列表(B树键t)))
(展平(树右t)())
t) )
(展平t())
;; 测试
>(定义树(使btree 10为空)
>(b树插入!树12)
>(b树插入!树9)
>(b树插入!树8)
>(b树插入!树15)
>(b树展平树)
=> (8 9 10 12 15)

这是一个非常棒的答案!非常感谢你!
(define (btree-insert! t key)
  (if (< key (btree-key t))
      (if (null? (btree-left t))
          (set-btree-left! t (make-btree key null null))
          (btree-insert (btree-left t) key))
      (if (null? (btree-right t))
          (set-btree-right! t (make-btree key null null))
          (btree-insert (btree-right t) key))))

(define (btree-flatten t)
  (define (flatten t result)
    (if (not (null? t))
        (begin
          (append result (append (flatten (btree-left t) ()) 
                                 (list (btree-key t)))
                  (flatten (btree-right t) ())))
        t))
  (flatten t ()))

;; test

> (define tree (make-btree 10 null null))
> (btree-insert! tree 12)
> (btree-insert! tree 9)
> (btree-insert! tree 8)
> (btree-insert! tree 15)
> (btree-flatten tree)
=> (8 9 10 12 15)