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)))
是否适合您?