我想在 Typed Racket 中使用
struct
定义一个类型。例如:
(struct a-node
([line : ProgLine]
[latency : Integer]
[pred-edges : (List Edge)]
[succ-edges : (List Edge)])
#:mutable
#:type-name Node)
假设我想用一些“空”值初始化一个字段(例如
line
),然后稍后更新该字段(a-node-line
)。我通常在搜索引擎上寻找一种惯用的方式,同样,在这里,我还没有找到令人满意的答案。我尝试过例如:
[line : (U ProgLine Void)]
然而,这会导致代码变得笨拙。我玩过使用也许单子,但这也不是我正在寻找的。它对于某些用例来说非常有用,但有时并不适用。我写了很多Scheme(其中可以表达
#f
或'()
),但没有写太多Racket。我的静态类型语言背景属于 C 家族,其中可以表示 NULL
、nullptr
等。在 Typed Racket 中表达指针变量“null”的惯用方式是什么?
对于上下文,我正在为编译器的后端构建一个调度程序,并且
Node
用于依赖关系图中的节点。这些 Node
结构将是邻接列表表示(双向)的邻接列表向量的哨兵/列表头。我在程序 IR 上以线性方式构建图表。在 IR 的顶部->底部遍历之前,我想初始化邻接向量,然后在构建过程中更新节点结构。
惯用的方法是使用
Option
类型,您可以在此处的 文档中找到。
请注意,这本质上相当于使用
#f
作为值的“空”版本。 Racket 还有一个很好的特性,即除 #f
之外的任何值都是真实的,因此我们可以通过执行以下操作来检查“空性”:
(if my-value
"value-case"
"null-case")