我想写这样的东西:
type NumExp = Num of float
type Exp =
| Num of float
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
let getValue (Num(n) : NumExp) = n
编译器抱怨NumExp
和Exp
in之间的冲突getValue
。即使以下失败:
let getValue (nn : NumExp) = match nn with | Num(n) -> n
有没有办法在与函数一起工作的两个有区别的联合中使用相同的情况?DU 定义本身是可以的。
我想使用相同的情况来避免添加间接级别,例如
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
在Exp
定义中。我觉得我在这里遗漏了一些非常基本的东西。
我拥有的原因NumExp
是我希望能够将 2 '插入' Exp
a Dot
(而不是 2 个浮点数),因为它使生成表达式更容易,但它们不能是 any Exp
,只是数字。
编辑:我真正想知道的是两个 DU 中的两个案例是否可以被视为同一个实体(有点像Exp
“包括” NumExp
)。我现在意识到Exp.Num
并且NumExp.Num
是完全独立的实体。Tomas 提供了一种区分以下两种情况的好方法。