我正在阅读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的了解,
Location
包含当前节点及其Path
或所谓的Context
。Path
具有除当前节点及其子节点以外的所有内容,或者有人将其称为a one-hole-context
。好吧,向上移动焦点意味着当前节点的父节点将成为新的当前节点。但是在这里,作者串联了当前节点及其兄弟节点。
但这不是父节点,而只是父节点的子节点。
在Scala中实现自己的moveUp方法时,我陷入了困境,但是无法正确表示当前节点的父节点。
最佳答案
这里的 zipper 适用于以下树数据类型:
type tree =
Item of item
| Section of tree list;;
本文中的路径数据类型是这样的:
type path =
Top
| Node of tree list * path * tree list;;
Node
包含三个组件。父节点的子节点位于孔的左侧(left
),路径进一步向上(up
)和父节点的子节点位于孔的右侧(right
)。向上移动时,为了产生实际的父节点,我们必须在
t
和left
之间的正确位置插入旧树right
。由于左侧的子级以相反的顺序存储,因此我们必须先对其进行反转。关于scala - 如何在HUET zipper 中向上导航,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12129300/