在打字球拍中是否有一种惯用的表达 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")
我想在 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")