OCaml中的循环映射

OCaml中的循环映射,ocaml,lazy-evaluation,recursive-datastructures,Ocaml,Lazy Evaluation,Recursive Datastructures,我正试图构造一个递归数据结构,但遇到了一些问题。我目前正在实现一个类型系统,并尝试实现递归类型。所以,我想使用OCaml的类型构造函数来获得实际的无限类型结构,它可以是递归的。这是我在错误仍然发生的情况下尽可能减少问题的尝试 module StringMap = Map.Make(String) type ty = | TyRecord of (ty StringMap.t) let rec recursive_ty = let rec temp = lazy ( TyRe

我正试图构造一个递归数据结构,但遇到了一些问题。我目前正在实现一个类型系统,并尝试实现递归类型。所以,我想使用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
执行
递归
的表达式时,会出现错误
异常:camlinternalazy.Undefined

基本上,我试图构造一个循环的
tystringmap.t
。我希望能够在不启用
-rectypes
的情况下执行此操作,特别是因为
递归类型不是递归的,它应该是
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));;
或者,您可以使用thunk