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について知っていることから、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は3つのコンポーネントが含まれています。穴の左側にある親ノードの子()、leftさらに上にあるパス(up)、および穴の右側にある親ノードの子(right)。

t上に移動するとき、実際の親ノードを生成するには、との間の正しい位置に古いツリーをプラグインする必要がleftありrightます。左側の子は逆の順序で格納されるため、最初に逆にする必要があります。

于 2012-08-26T10:45:54.443 に答える
2

作成者は、現在のノードとその兄弟を連結します。しかし、それは親ノードではなく、親ノードの子だけです

kosmikusによって引用された紙の定義では、非リーフノードSectionはその子以外の何物でも定義されていません。追加情報を追加した場合は、それをジッパーの定義に追加する必要があります。

于 2012-08-26T16:36:02.950 に答える