2013-04-01 46 views
8

简化后,我在OCaml的这个简单的代码:无法解构产品类型OCaml中

type int_pair = int * int;; 
type a = A of int_pair;; 
let extract (A x) = x;; 

测试我extract功能,它似乎工作:

# extract (A (1,2));; 
- : int_pair = (1, 2) 

我简化它,所以它只需要一种类型:

type a' = A' of int * int;; 
let extract' (A' x) = x;; 

但我得到的错误:

Error: The constructor A' expects 2 argument(s), 
     but is applied here to 1 argument(s) 

有趣的是,我可以构建的a'值...

# A' (1,2);; 
- : a' = A' (1, 2) 

...我只是不能解构它们。为什么?

回答

13

您需要使用

type a' = A' of (int * int) 

这是OCaml的类型说明了棘手的地方之一。

这里涉及两种不同类型的有微妙的不同:

type one_field = F1 of (int * int) 
type two_fields = F2 of int * int 

在类型one_field有一个单一字段,其在一对整数的。在类型two_fields中有两个字段,每个字段都是一个int。棘手的是,构造看起来相同:

# F1 (3, 5);; 
- : one_field = F1 (3, 5) 
# F2 (3, 5);; 
- : two_fields = F2 (3, 5) 

这两种类型是不同的,并且事实上在内存中代表不同。 (两场变体实际占用的空间较小,访问速度稍快。)