Типы изменчивых вариантов 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

Другие вопросы по тегам