如何在HUET拉链内导航

Saw*_*yer 9 ocaml haskell functional-programming scala 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);;
Run Code Online (Sandbox Code Playgroud)

其他类型定义的完整来源可以在链接的文章中找到,如果您了解Zipper,我认为回答我的问题无关紧要.

根据我对Zipper的了解,a Location包含当前节点及其Path所谓的 节点Context.在Path比当前节点及其子节点,或者有些人把它叫做其他的一切a one-hole-context.

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

kos*_*kus 5

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

type tree =
   Item of item
 | Section of tree list;;
Run Code Online (Sandbox Code Playgroud)

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

type path =
   Top
 | Node of tree list * path * tree list;;
Run Code Online (Sandbox Code Playgroud)

Node包含三个组件.父节点的子节点位于hole(left)的左侧,路径更靠上(up),父节点的子节点位于hole(right)的右侧.

当动了起来,以产生实际的父节点,我们在老树插t在之间正确的位置leftright.由于左边的孩子以相反的顺序存储,我们必须先将它们反转.