ocaml中GADT的异构列表

时间:2018-03-28 15:15:52

标签: ocaml gadt heterogeneous

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

考虑以下类型:

 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

似乎无法实现,因为它返回以下错误消息:

struct A_Helper : public A
{
    static int GetProtectedValue(const A & a)
    {
        return static_cast<const A_Helper&>(a).Value;
    }
};

有办法吗?

我查看了ocaml documentation for GADT,但未能找到或了解如何执行此操作。

有人能指出我可以解释为什么你不能用GADT做你用ADT做的一切吗?

1 个答案:

答案 0 :(得分:0)

一种解决方案是:

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

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

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

existential wrapper