OCaml中循环双向链表的实现
Implementation of a circular doubly linked list in OCaml
我正在尝试使用 OCaml 类型声明实现循环双向链表。这是我的:
type 'a cList =
{
mutable value : 'a;
mutable left : 'a cList option;
mutable right : 'a cList option
}
;;
当我需要声明包含单个元素的第一个列表时出现问题。因为在分配之前无法引用该元素,所以我无法让单元格的左右成员指向自身。
到目前为止,我唯一的解决方法是允许左右成员为选项类型,将它们设置为 None,然后修改它们,使它们指向单元格本身。
let unitClist v = let a = {
value = v;
left = None;
right = None
}
in
a.left <- Some a;
a.right <- Some a;
a
;;
它可以工作,但是当你确定有一个值时必须使用选项类型有点绑定。
有更好的方法吗?
提前致谢。
您可以改用对象,它们是后期绑定的,因此允许 self-reference:
object(self)
method value = v
method left = self
method right = self
end
当然,这会带来性能成本,因为所有方法调用都将动态分派,但否则这是不可能的,所以这是必不可少的 trade-off。如果不采用某种间接方式,您无法引用尚不存在的内容(编辑:heap-allocated 记录已经存在。参见 )。
显然你也可以直接用记录定义一个递归值。通过使用 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
中有记录
我正在尝试使用 OCaml 类型声明实现循环双向链表。这是我的:
type 'a cList =
{
mutable value : 'a;
mutable left : 'a cList option;
mutable right : 'a cList option
}
;;
当我需要声明包含单个元素的第一个列表时出现问题。因为在分配之前无法引用该元素,所以我无法让单元格的左右成员指向自身。 到目前为止,我唯一的解决方法是允许左右成员为选项类型,将它们设置为 None,然后修改它们,使它们指向单元格本身。
let unitClist v = let a = {
value = v;
left = None;
right = None
}
in
a.left <- Some a;
a.right <- Some a;
a
;;
它可以工作,但是当你确定有一个值时必须使用选项类型有点绑定。 有更好的方法吗? 提前致谢。
您可以改用对象,它们是后期绑定的,因此允许 self-reference:
object(self)
method value = v
method left = self
method right = self
end
当然,这会带来性能成本,因为所有方法调用都将动态分派,但否则这是不可能的,所以这是必不可少的 trade-off。如果不采用某种间接方式,您无法引用尚不存在的内容(编辑:heap-allocated 记录已经存在。参见
显然你也可以直接用记录定义一个递归值。通过使用 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
中有记录