是否有一种惯用的方式在类型化球拍中表达 Null?

问题描述

我想在 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}。有没有这样“简单”的方式来为类型化球拍中的指针变量表达 nil?

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

但我对一般情况下的问题很感兴趣,因为我现在在用打字/球拍写作时遇到了太多次......

解决方法

惯用的方法是使用 Option 类型,您可以在 docs here 中找到该类型。

请注意,这实质上相当于使用 #f 作为值的“空”版本。 Racket 也有一个很好的属性,即除 #f 之外的任何值都是真值,因此我们可以通过执行以下操作来检查“空性”:

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