假设我想在 OCaml 中建模一个简单的表达式类型:
type expr =
| `Int of int
| `Str of string
| `IntAdd of expr * expr
| `StrAdd of expr * expr
是否可以限制其自身expr
的expr * expr
特定构造函数expr
(即我IntExpr
只想允许'Int')?我可以通过模式匹配来模仿这一点,但expr
扩展后会变得很麻烦。我可以以某种方式使用 OCaml 的类型系统来实现这一点吗?
我尝试使用多态类型上限如下:
type expr =
| `Int of int
| `Str of string
| `IntAdd of [< `Int] * [< `Int]
| `StrAdd of [< `Str] * [< `Str]
但编译器不接受这个(带有 message In case IntAdd of [< Int ] * ([< Int ] as 'a) the variable 'a is unbound
)。有什么诀窍可以使这项工作吗?