在《类型球拍指南》中,要定义联合类型,只需使用即可(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
,如何使它成为a 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]))
现在问题更加清楚了。节点结构期望a 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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句