8

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

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.

该怎么办?

4

1 回答 1

7

H/T 致 Gabriel Scherer 在caml-list上回答。

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

type 'a s = S of 'a

(或只是type 'a s = S

它们具有“更好的”注入特性。我们已经在邮件列表中提到过几次,这也是 Jacques Garrigue 在 9 月 OCaml 研讨会上的演讲中的“简单外卖课程”。

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

于 2013-12-20T15:02:07.510 回答