在OCaml中实现循环双向链接列表

问题描述

我正在尝试使用OCaml类型声明来实现循环双向链接列表。这是我所拥有的:

type 'a cList = 
{ 
mutable value : 'a; 
mutable left : 'a cList option; 
mutable right : 'a cList option 
}
;;

当我需要声明包含单个元素的第一个列表时出现问题。因为无法在分配元素之前引用该元素,所以我无法使该单元的左右成员指向其自身。 到目前为止,我唯一的解决方法是允许左成员和右成员成为type选项,将它们设置为None,然后修改它们,使其指向单元格本身。

let unitClist v = let a = {
                      value = v; 
                      left = None; 
                      right = None
                      }
              in
              a.left <- Some a; 
              a.right <- Some a;
              a
;;

它可以工作,但是当您确定有一个值时,必须与选项类型一起工作有点绑定。 有更好的方法吗? 预先感谢。

解决方法

显然,您也可以直接使用记录来定义递归值。通过使用rec绑定,您可以在定义中递归引用绑定(在某些情况下):

type 'a cList = {
  mutable value : 'a; 
  mutable left : 'a cList; 
  mutable right : 'a cList 
}

let unitClist v =
  let rec a = {
    value = v; 
    left = a; 
    right = a
  }
  in a

这已记录在Chapter 8.1 of the OCaml Manual

中 ,

您可以改用对象,它们是后期绑定的,因此允许自我引用:

object(self)
  method value = v
  method left = self
  method right = self
end

这当然会降低性能,因为所有方法调用都会动态分派,但是否则这是不可能的,因此这是必不可少的折衷方案。如果不采用某种间接方式,就无法引用尚不存在的内容(编辑:已在堆中分配的记录。请参见my other answer)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...