Racket 如何定义联合多态数据结构';什么样的球拍?

Racket 如何定义联合多态数据结构';什么样的球拍?,racket,typed-racket,Racket,Typed Racket,从中,要定义联合类型,只需使用(define Type Some Type(U Type1 Type2)) 要定义多态数据结构,请使用类似(定义类型(opta)(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

从中,要定义联合类型,只需使用
(define Type Some Type(U Type1 Type2))

要定义多态数据结构,请使用类似
(定义类型(opta)(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>
>t1
-:(叶正字节)
#

请参阅有关子类型的参考()。基本上,当您使用联合类型时,Racket不会破坏旧类型。例如,您可以定义类型
(U字符串编号)
,但
字符串
编号
仍然可用
1
仍将被识别为
Number
,但您可以在任何需要
(U字符串编号)
的地方使用它,因为
Number
(U字符串编号)
的子类型

类似地,
t1
是一个
Leaf
,所以Racket报告
t1
是一个
Leaf
也没有什么错。然而,
Leaf
Tree
的一个子类型,因此
t1
可用于需要
Tree
的地方

执行此操作时:

(define-type (Tree a) (U (Leaf a) Node))
您将
树定义为类型构造函数。你不应该把
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))

当我定义类似于
(定义t3(节点(叶3)(节点(叶5)(叶8)))
的内容时,会出现一个类型错误.Hm。这对我很有用。你用的是什么版本的球拍?无论如何,您可以通过添加显式类型注释或使用
inst
来修复它。
(:t3:(Treeof Integer))(定义t3(节点(叶3)(节点(叶5)(叶8)))
是否适合您?