如何在HUET拉链内导航

时间:2012-08-26 10:15:50

标签: scala haskell functional-programming ocaml zipper

我正在阅读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或所谓的ContextPath包含除当前节点及其子节点以外的所有内容,或者某些人称之为a one-hole-context

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

2 个答案:

答案 0 :(得分:5)

此处的拉链适用于以下树数据类型:

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

本文中的路径数据类型为:

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

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

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

答案 1 :(得分:2)

  

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

通过kosmikus引用的纸张定义,非叶节点Section除了其子节点之外别无定义。如果添加了其他信息,则必须将其添加到拉链的定义中。