тип записи ocaml и ноль

Я пытаюсь определить тип, например:

введите ааа = NULL | {а: интервал; б: интервал};;

Но компилятор не позволяет это сделать. Я не знаю, почему мы не можем смешивать тип записи ни с чем другим.

Мне нужно сопоставить значение, если это тип записи или нулевая запись, и я устал создавать фиктивные записи, такие как {a = -999; б = -999}.

Есть ли способ лучше ?


person romerun    schedule 04.01.2010    source источник


Ответы (2)


Часть «запись» определения должна быть выполнена в отдельном типе. Затем вы можете обернуть это в тип «опция», если хотите выразить «Нет» или «Некоторое значение».

type aaa = {a: int; b: int}
type bbb = aaa option
person newacct    schedule 04.01.2010
comment
Встроенные записи поддерживаются, начиная с OCaml версии 4.03. См. caml.inria.fr/pub/docs/manual-ocaml/manual040. .html и blog.janestreet.com/ ocaml-4-03-все-остальные/#встроенные-записи. - person jdprc06; 13.11.2019

Первая проблема: в подходе 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
comment
Блестящий ответ, Объединение - это действительно головная боль, я пока не могу понять всей картины, стоящей за этим. - person 0xFF; 05.01.2010