以参数方式将 'Null 构造函数添加到多态变体



以下类型声明不起作用:

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

最新更新