以下类型声明不起作用:
type 'a or_null = [ 'a | `Null ]
和
type 'a or_null = [ 'a | `Null ] constraint 'a = [> `A | `B ]
随着消息:
错误:类型 'a 未扩展为多态变体类型
提示:你的意思是"一个
我想在不使用内存表示(和语法(中的另一层来实现这一点。特别是,我想避免使用选项类型,例如
type 'a or_null = | A of 'a | Null
有没有办法仅使用多态变体来拥有这样的类型?最终目标是在'a or_null
类型上编写例如monads。(这实际上是棘手的部分。
多态变体无法跟踪特定构造函数的缺失。这意味着我们无法真正编写通常的绑定。如果我们尝试
let bind x f =
match x with
| `Null -> `Null
| x -> f x
我们得到
val bind: ([> `Null] as 'a) -> ('a -> ([>`Null] as 'b)) -> 'b
如果为了可读性,我们添加以下类型缩写
type 'a m = [> `Null] as 'a
(这是or_null
的替代定义(以前的类型读作
val bind: 'a m -> ('a m -> 'b m) -> 'b m
换句话说,bind
的函数参数f
必须已经处理其参数中的`Null
情况,因为类型系统无法在匹配的第二个分支中表达约束x <> `Null
。