3

我想使用 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);]

这似乎是不可能的,因为它返回以下错误消息:

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

有没有办法做到这一点?

我查看了GADT 的 ocaml 文档,但没有找到或不明白如何去做。

有人可以向我指出一些可以解释为什么你不能用 GADT 做所有你可以用 ADT 做的事情吗?

4

1 回答 1

2

一种解决方案是:

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

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

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

existential wrapper
于 2018-03-28T15:26:49.070 回答