Je lis Huet Zipper, je ne peux pas comprendre la méthode de go_up:Comment naviguer à l'intérieur d'un HUET Zipper
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);;
La source complète d'autres types de définitions se trouvent dans le document lié, si vous comprenez Zipper , Je pense que cela n'a pas d'importance de répondre à ma question. D'après ce que je sais à propos de Zipper, un Location
contient le nœud actuel et son Path
ou le Context
. Le Path
a tout autre que le nœud actuel et ses sous-nœuds, ou certaines personnes l'ont appelé a one-hole-context
. Eh bien, en déplaçant la mise au point, le nœud parent du nœud actuel deviendra le nouveau nœud actuel. Mais ici, l'auteur concatène les nœuds actuels et ses frères et soeurs. Mais ce n'est pas un nœud parent, seulement les enfants du nœud parent. Je suis bloqué ici lors de l'implémentation de ma propre méthode moveUp dans Scala, et j'ai échoué à représenter correctement le nœud parent du nœud actuel.
Vous pouvez vous inspirer d'une ancienne implémentation de zipper n-aire de la mienne: http://gist.github.com/3477576 – ron
@ron Votre contexte contient toujours une référence aux données du nœud parent, le contexte de ce document ne 't. J'en ai vu d'autres, au lieu de tenir un contexte parent, ils possèdent un emplacement parent, ce qui vous donne également la possibilité d'accéder au nœud parent. – Sawyer
Vous ne pouvez pas vous soucier du portage vers une autre langue, mais 'rev foo @ bar' aurait avantage à être écrit' List.rev_append foo bar', qui traversera 'foo' une fois au lieu de deux fois. – gasche