OCaml中的循环图

恩里科·博尔巴(Enrico Borba)

我正在尝试构造一个递归数据结构,但是遇到了一些问题。我当前正在实现类型系统,并且正在尝试实现递归类型。因此,我想使用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

基本上,我正在尝试构造一个cyclic ty StringMap.t我希望能够在不启用的情况下-rectypes执行此操作,尤其是由于的类型recursive_ty不是递归的,因此应该为ty我知道以下工作正常:

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

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

但我想使用AStringMap来有效地搜索关键字。任何帮助将不胜感激。

静脉血

您必须使构造函数变得懒惰,例如,

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

或者,您可以使用重击。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章