9

我正在阅读Huet Zipper,我无法理解 go_up 方法:

let go_up (Loc(t,p)) = match p with
Top -> failwith "up of top"
| Node(left,up,right) -> Loc(Section((rev left) @ (t::right)),up);;

其他类型定义的完整来源可以在链接的论文中找到,如果您了解 Zipper,我认为回答我的问题并不重要。

根据我对 Zipper 的了解,aLocation包含当前节点及其Path或所谓的 Context. 拥有除了当前节点及其子节点之外的Path所有内容,或者有些人称之为a one-hole-context

好吧,将焦点上移,意味着当前节点的父节点将成为新的当前节点。但在这里,作者连接了当前节点及其兄弟节点。但这不是父节点,只是父节点的子节点。在 Scala 中实现我自己的 moveUp 方法时,我被困在这里,并且无法正确表示当前节点的父节点。

4

2 回答 2

5

这里的拉链适用于以下树数据类型:

type tree =
   Item of item
 | Section of tree list;;

论文中的路径数据类型是这样的:

type path =
   Top
 | Node of tree list * path * tree list;;

Node包含三个组件。位于孔左侧的父节点的子节点 ( left)、进一步向上的路径 ( up) 以及位于孔右侧的父节点的子节点 ( right)。

向上移动时,为了产生实际的父节点,我们必须在和t之间的正确位置插入旧树。由于左边的孩子是以相反的顺序存储的,我们必须先将它们反转。leftright

于 2012-08-26T10:45:54.443 回答
2

作者连接当前节点及其兄弟节点。但这不是父节点,只是父节点的子节点

根据 kosmikus 引用的论文定义,非叶节点Section仅由其子节点定义。如果您添加了附加信息,则必须将其添加到拉链的定义中。

于 2012-08-26T16:36:02.950 回答