Циклическое отображение в OCaml

#ocaml #lazy-evaluation #recursive-datastructures

#ocaml #отложенная оценка #рекурсивный-структуры данных

Вопрос:

Я пытаюсь построить рекурсивную структуру данных, но у меня возникают некоторые проблемы. В настоящее время я внедряю систему типов и пытаюсь реализовать рекурсивные типы. Итак, я хотел иметь реальные структуры бесконечного типа, которые могут быть рекурсивными, используя конструкторы типов OCaml. Это моя попытка максимально уменьшить проблему, поскольку ошибка все еще возникает.

 module StringMap = Map.Make(String)

type ty = 
  | TyRecord of (ty StringMap.t)

let rec recursive_ty =
  let rec temp = lazy (
    TyRecord (StringMap.singleton "self" (Lazy.force temp))
  ) in
  Lazy.force temp
  

И ошибка Exception: CamlinternalLazy.Undefined возникает при выполнении выражения для recursive_ty .

В принципе, я пытаюсь создать циклическое ty StringMap.t . Я хочу иметь возможность делать это без включения -rectypes , тем более что тип recursive_ty не является рекурсивным, он просто должен быть ty . Я знаю, что следующее работает просто отлично:

 type ty = 
  | TyRecord of (string * ty) list

let rec recursive_ty = TyRecord [("self", recursive_ty)]
  

но я хочу использовать StringMap для эффективного поиска ключей. Любая помощь была бы с благодарностью принята.

Ответ №1:

Вы должны сделать конструктор ленивым, например,

 type ty = TyRecord of ty StringMap.t Lazy.t
let rec t = TyRecord (lazy (StringMap.singleton "self" t));;
  

В качестве альтернативы вы можете использовать блокировку.