Я пытаюсь построить рекурсивную структуру данных, но у меня возникают некоторые проблемы. В настоящее время я реализую систему типов и пытаюсь реализовать рекурсивные типы. Итак, я хотел иметь настоящие структуры бесконечных типов, которые могли бы быть рекурсивными, используя конструкторы типов 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
для эффективного поиска ключей. Любая помощь будет принята с благодарностью.
Вы должны сделать конструктор ленивым, например,
type ty = TyRecord of ty StringMap.t Lazy.t
let rec t = TyRecord (lazy (StringMap.singleton "self" t));;
В качестве альтернативы вы можете использовать преобразователь.