Невозможно деконструировать тип продукта после упрощения в 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)

...Я просто не могу их разобрать. Почему?


person Dog    schedule 01.04.2013    source источник


Ответы (1)


Вам нужно использовать

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 есть два поля, каждое из которых является целым числом. Сложность в том, что конструктор выглядит одинаково:

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

Эти два типа различны и фактически по-разному представлены в памяти. (Вариант с двумя полями на самом деле занимает меньше места и доступ к нему немного быстрее.)

person Jeffrey Scofield    schedule 01.04.2013