racket - 如何在Typed Racket中定义Union多态数据结构的实例?

标签 racket typed-racket

来自 Typed Racket Guide ,要定义联合类型,只需使用 (define-type Some-Type (U Type1 Type2))

要定义多态数据结构,请使用类似 (define-type (Opt a) (U ...)) 的内容。

我想定义一个多态二叉树

(define-type (Tree a) (U (Leaf a) Node))
(struct (a) Leaf ([val : a]))
(struct Node ([left : Tree] [right : Tree]))
(define t1 (Leaf 5))
(define t2 (Leaf 8))
(define t3 (Node t1 t2))

我想知道为什么t1的类型是Leaf而不是Tree,以及如何使其成为Tree

> t1
- : (Leaf Positive-Byte)
#<Leaf>

最佳答案

当你这样做时:

(define-type (Tree a) (U (Leaf a) Node))

您将 Tree 定义为类型构造函数。您不应该将 Tree 本身视为一种类型,而仅将 (Tree Some-Concrete-Type) 视为一种类型。因此将其重命名为 Treeof:

(define-type (Treeof a) (U (Leaf a) Node))
(struct (a) Leaf ([val : a]))
(struct Node ([left : Treeof] [right : Treeof]))

现在问题更清楚了。节点结构需要一个 Treeof,但是什么树呢?你想要的是这样的:

(define-type (Treeof a) (U (Leaf a) (Node a)))
(struct (a) Leaf ([val : a]))
(struct (a) Node ([left : (Treeof a)] [right : (Treeof a)]))

现在您的示例可以运行了:

#lang typed/racket
(define-type (Treeof a) (U (Leaf a) (Node a)))
(struct (a) Leaf ([val : a]))
(struct (a) Node ([left : (Treeof a)] [right : (Treeof a)]))
(define t1 (Leaf 5))
(define t2 (Leaf 8))
(define t3 (Node t1 t2))

关于racket - 如何在Typed Racket中定义Union多态数据结构的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34827080/

相关文章:

autocomplete - Racket博士有自动完成功能吗?

types - 如何在 Typed Racket 中编写以多态函数作为参数的高阶函数?

racket - 如何指定输出与 'Any' 输入相同?

linux - GTK/Qt On PLT 方案

performance - ( Racket )哈希集与哈希集的性能!和函数式编程

data-structures - 将函数应用于 Racket 中的树结构

scheme - 如何修复列表中近对总和的错误

racket - 在打字 Racket 中进行 curry

functional-programming - 使用给定数量的字符串创建一个列表

racket - 使用合约定义 Typed Racket 结构