GADT定义

时间:2013-12-19 22:25:16

标签: ocaml gadt

这只是一个测试,所以我不太关心,但我有这些定义:

type z
type _ s
type (_, _, _) balance =
  | Less : (*∀'a.*) ('a, 'a s, 'a s) balance
  | Same : (*∀'b.*) ('b, 'b, 'b) balance
  | More : (*∀'a.*) ('a s, 'a, 'a s) balance
type _ aVL =
  | Leaf : z aVL
  | Node : (*∀'a, 'b, 'c.*)('a, 'b, 'c) balance * 'a aVL * int * 'b aVL ->
    ('c s) aVL

我收到“type _ aVL =”的错误:

Error: In this definition, a type variable cannot be deduced
       from the type parameters.

怎么办?

1 个答案:

答案 0 :(得分:4)

H / T到Gabriel Scherer回答 caml-list

  

不要使用这种抽象类型定义。使用替代(和导出)具体定义(即使你不使用它们的构造函数)

type 'a s = S of 'a
  

(或只是type 'a s = S

     

他们具有“更好”的注入属性。我们已经在邮件列表中提到了几次,这也是雅克·加里格在9月举行的OCaml研讨会上的“简单的外卖课”。

因为我没有谷歌搜索问题而感到羞耻。这里解决了确切的问题:GADTs : a type variable cannot be deduced