#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));;
В качестве альтернативы вы можете использовать блокировку.