ocaml中GADT的异构列表

Heterogeneous list of GADT in ocaml

我想使用 GADT 的规范示例创建一个异构表达式列表。

给定以下类型:

type _ value =
| Bool : bool -> bool value
| Int : int -> int value

type _ expr =
| Value : 'a value -> 'a expr
| If : bool expr * 'a expr * 'a expr -> 'a expr
| Eq : 'a expr * 'a expr -> bool expr
| Lt : int expr * int expr -> bool expr

我尝试创建以下列表:

 let a = [Value (Bool true); Value (Int 1);]

这似乎是不可能的,因为它 returns 出现以下错误消息:

Error: This expression has type int value
       but an expression was expected of type bool value
       Type int is not compatible with type bool

有办法吗?

我查看了 ocaml documentation for GADT,但要么找不到,要么不明白该怎么做。

有人能给我指出一些东西来解释为什么你不能用 GADT 做你用 ADT 能做的一切吗?

一个解决方案是:

type any_expr = Any:'a expr -> any_expr
let a = [Any (Value (Bool true)); Any (Value (Int 1));]

但我不明白为什么它有效或为什么需要它。因此,如果有人提供阅读,我仍然感兴趣。

好的,所以我发现这是重复的,关键字是:

existential wrapper