【发布时间】:2016-10-17 22:25:09
【问题描述】:
我想在 OCaml 中表示游戏树。当前位置是根,根的子节点代表移动后的一些结果位置,依此类推。我想动态扩展这个游戏树(一一添加新的可能动作)。
我有一个“位置”类型。我认为天真的方式是:
type tree = Nil | Node of position * (tree list);;
但这不允许我通过添加新动作来增加我的树,因为列表是不可变的。我也考虑过:
type tree = Nil | Node of position * ((tree list) ref);;
但是每次我想扩展一个节点时,我都必须替换整个子树列表,导致我想有很多无用的空间?所以我能想到的唯一方法如下:
type 'a mlist = Empty | Cons of 'a * (('a mlist) ref);;
type tree = Nil | Node of position * ((tree mlist) ref);;
但这似乎非常不优雅,特别是因为我基本上永远不会使用 Empty 或 Nil,具体取决于我编写叶子的方式。
【问题讨论】:
-
树列表引用对我来说看起来完全理智。只要在列表头部添加新树,您就不必担心空间问题。
-
我认为拉链在这里会很好用。如果他们同意,也许其他人可以扩展它。
-
哦,谢谢 nlucaroni,我只读过关于二叉树拉链的文章,并没有意识到原来的 Huet 论文正是我所需要的!