在OCaml中简化后无法解构产品类型

时间:2013-04-01 21:58:54

标签: ocaml algebraic-data-types

我在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)

......我无法解构它们。为什么呢?

1 个答案:

答案 0 :(得分: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)

这两种类型是截然不同的,实际上在内存中表现不同。 (双字段变体实际上占用的空间更少,访问速度稍快。)