Циклическая карта в OCaml - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь построить рекурсивную структуру данных, но у меня возникли некоторые проблемы.В настоящее время я внедряю систему типов и пытаюсь реализовать рекурсивные типы.Итак, я хотел иметь реальные бесконечные структуры типов, которые могут быть рекурсивными, используя конструкторы типов 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 Ответ

1 голос
/ 09 апреля 2019

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

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

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

...