我正在尝试使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句