在打字球拍中是否有一种惯用的表达 Null 的方式?

Is there an idiomatic way of expressing Null in typed racket?

我想在 typed/racket 中使用 struct 定义一个类型。例如:

(struct a-node 
    ([line : ProgLine]
    [latency : Integer]
    [pred-edges : (List Edge)]
    [succ-edges : (List Edge)])
    #:mutable
    #:type-name Node)

假设我想用一些 ('()|void|#f|...) 值初始化某些字段(例如 line),然后更新该字段 (a-node-line)稍后的。我一直在寻找一种惯用的方式,一般在搜索引擎上,同样地,在这里,我没有找到满意的答案。我试过例如:

[line : (U ProgLine Void)]

但这会导致代码笨拙。我玩过使用 maybe monad,但这也不是我想要的。这对于某些用例来说很棒,但有时并不合适。我已经写了很多方案(其中有人会表达 {#f} 或 {'()}),但没有太多的球拍。我的静态类型语言背景属于 C 系列,其中可以表示 {null}。有没有这样“简单”的方式来表达类型球拍中指针变量的零?

对于上下文,我正在为编译器的后端构建一个调度程序,并且节点用于依赖关系图中的节点。这些节点结构将成为邻接列表表示(双向)的邻接列表向量的哨兵/列表头。我通过程序 IR 在线性传递中构建图形。在IR的top->bottom遍历之前,我想初始化邻接向量,然后在构建图的过程中更新Node结构。

但我对一般情况下的问题很感兴趣,因为我现在在 typed/racket...

中遇到这个问题太多次了

惯用的方法是使用 Option 类型,您可以在 docs here.

中找到它

请注意,这实际上相当于使用 #f 作为值的“空”版本。 Racket 还具有 属性 的优点,即 #f 以外的任何值都是真实的,因此我们可以通过以下方式检查“null-ness”:

(if my-value
   "value-case"
   "null-case")