Типы изменчивых вариантов OCaml
Руководство Caml Light упоминает типы изменчивых вариантов на странице 37:
type foo = A of mutable int
| B of mutable int * int
Но это расширение, похоже, не является частью OCaml или нет? Прав ли я, что единственный способ определить изменяемый тип варианта в OCaml - это использовать изменяемые записи или массивы?
(* with records *)
type a = {mutable a: int}
and b = {mutable b1: int; mutable b2: int}
and foo = A of a
| B of b
(* with arrays *)
type foo = A of int array
| B of int array
Редактировать: Спасибо @gasche, предлагая использовать ссылки, которые являются ярлыком для изменяемой записи:
type foo = A of int ref
| B of int ref * int ref
2 ответа
Действительно, изменяемые варианты были отброшены при переходе между Caml Light и OCaml, отчасти потому, что синтаксис для манипулирования ими был очень неуклюжим (сопоставление с образцом в изменяемом поле сделало бы идентификатор шаблона lvalue, yumm...).
Современные способы выражения изменчивости - через изменяемые поля записей (которые имеют правильный синтаксис мутации полей) или ссылки. int ref
(которые определяются как изменяемые записи с одним полем).
Вы можете использовать ссылки в качестве сокращения.
Проверьте 2.2. Изменяемое хранилище и побочные эффекты от http://caml.inria.fr/pub/docs/u3-ocaml/ocaml-core.html