我在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)
......我无法解构它们。为什么呢?
答案 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)
这两种类型是截然不同的,实际上在内存中表现不同。 (双字段变体实际上占用的空间更少,访问速度稍快。)