代码之家  ›  专栏  ›  技术社区  ›  Daiwen

ocaml中GADT的异构列表[重复]

  •  3
  • Daiwen  · 技术社区  · 6 年前

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

    有办法吗?

    我看了看 ocaml documentation for GADT 要么找不到,要么不知道怎么做。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Daiwen    6 年前

    一种解决方案是:

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

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

    好的,我发现这是一个副本,关键字是:

    existential wrapper