Первая проблема: в подходе Objective Caml у вас не может быть чистых типов объединения без конструкторов. Рассмотрим следующую загадку:
type test = Null | {a : int ; b: int }
let value = { a: 0 ; b : 42 } in print_int value.a
Вторая строка неверна, потому что value
относится к типу объединения и, следовательно, может быть Null
, у которого нет члена a
. Это привело бы к неявному предположению о значении типа объединения, чего Objective Caml избегает любой ценой. Это означает, что вам нужен конструктор.
Но даже этого было бы достаточно, потому что тогда у вас был бы анонимный тип записи:
type test = Null | Pair of { a : int ; b : int }
match Pair { a : 0 ; b : 42 } with
| Null -> 0
| Pair p -> p.a
Какой здесь будет тип p
? Это, безусловно, можно было бы решить, разрешив в языке анонимные типы записей, но это не простое добавление, поскольку такие типы, как известно, трудно обрабатывать с помощью подхода к унификации типов и требуют множества дополнительных конструкций для поддержки (например, < ; ... >
, конструкции #type
и value :> type
для обработки объектов).
Разработчики языка пошли по простому пути и потребовали, чтобы все типы записей получали имя. Конечно, если у вас очень простая запись, вы можете использовать кортеж:
type test = Null | Pair of int * int
person
Victor Nicollet
schedule
04.01.2010