gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:29:19 25 4
gpt4 key购买 nike

来自 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com