Programmation Fonctionnelle Avancée
Manipulation efficace d’une structure de donnée arborescente
Zippers
Zipper des arbres binaires
let bas_a_gauche : ’ a a r b r e z i p p e r −> ’ a a r b r e z i p p e r =
function ( p i l e , a r b r e ) −>match arbre w i t h
| Feuille −> r a i s e ( Z i p p e r " F e u i l l e " )
| Noeud ( x , t1 , t 2 ) −> ( Gauche , x , t 2 ) : : p i l e , t 1 ; ;
|| val bas_a_gauche : ’ a a r b r e z i p p e r −> ’ a a r b r e z i p p e r = <f u n >
let bas_a_droi t e : ’ a a r b r e z i p p e r −> ’ a a r b r e z i p p e r =
function ( p i l e , a r b r e ) −>match arbre w i t h
| Feuille −> r a i s e ( Z i p p e r " F e u i l l e " )
| Noeud ( x , t1 , t 2 ) −> ( D r o i t e , x , t 1 ) : : p i l e , t 2 ; ;
|| val bas_a_droi t e : ’ a a r b r e z i p p e r −> ’ a a r b r e z i p p e r = <fu n>
let en_haut : ’ a a r b r e z i p p e r −> ’ a a r b r e z i p p e r =
function ( p i l e , a r b r e ) −>match p i l e w i t h
| ( Gauche , x , t ) : : p −> p , Noeud ( x , a r b r e , t )
| ( D r o i t e , x , t ) : : p −> p , Noeud ( x , t , a r b r e )
| _ −> r a i s e ( Z i p p e r " R ac i n e " ) ; ;
|| val en_haut : ’ a a r b r e z i p p e r −> ’ a a r b r e z i p p e r = <f u n>
Programmation Fonctionnelle Avancée
Manipulation efficace d’une structure de donnée arborescente
Zippers
Zipper des arbres n-aires
type ’ a n a r b r e =
| F e u i l l e of ’ a
| Noeud of ’ a n a r b r e l i s t ; ;
type ’ a b l o c k = ’ a n a r b r e l i s t z i p p e r
type ’ a p i l e = ’ a b l o c k l i s t
type ’ a n a r b r e z i p p e r = ’ a p i l e ∗’ a n a r b r e ; ;
Programmation Fonctionnelle Avancée
Manipulation efficace d’une structure de donnée arborescente
Zippers
Zipper des arbres n-aires
let a_gauche : ’ a n a r b r e z i p p e r −> ’a narbrezipper =
function ( p i l e , a r b r e ) −>match p i l e w i t h
| ( a : : lp , l ) : : p −> ( lp , a r b r e : : l ) : : p , a
| ( [ ] ,_ ) : : p −> r a i s e ( Z i p p e r " D ej a ␣a ␣ g au ch e " )
| _ −> f a i l w i t h " Ra c in e " ; ;
|| val a_gauche : ’ a n a r b r e z i p p e r −> ’a narbrezipper = <fun>
let a _ dr oi t e : ’ a n a r b r e z i p p e r −> ’a narbrezipper =
function ( p i l e , a r b r e ) −>match p i l e w i t h
| ( lp , a : : l ) : : p −> ( a r b r e : : l p , l ) : : p , a
| (_ , [ ] ) : : p i l e ’ −> r a i s e ( Z ip pe r " Deja ␣a ␣ d r o i t e " )
| _ −> r a i s e ( Z i p p e r " R ac i n e " ) ; ;
|| val a _ dr oi t e : ’ a n a r b r e z i p p e r −> ’a narbrezipper = <fu n>
Programmation Fonctionnelle Avancée
Manipulation efficace d’une structure de donnée arborescente
Zippers
Zipper des arbres n-aires
let en_bas : ’ a n a r b r e z i p p e r −> ’a narbrezipper =
function ( p i l e , a r b r e ) −>match arbre w i t h
| Noeud ( a ’ : : a r b r e s ) −> ( [ ] , a r b r e s ) : : p i l e , a ’
| Noeud _ | F e u i l l e _ −> r a i s e ( Z i p p e r " D eja ␣ en ␣ b as " ) ; ;
|| val en_bas : ’ a n a r b r e z i p p e r −> ’a narbrezipper = <fu n >
let en_haut : ’ a n a r b r e z i p p e r −> ’a narbrezipper =
function ( p i l e , a r b r e ) −>match p i l e w i t h
| ( lp , l ) : : p −> p , Noeud ( L i s t . r e v ( l p )@( a r b r e : : l ) )
| _ −> r a i s e ( Z i p p e r " D eja ␣ en ␣ h au t " ) ; ;
|| val en_haut : ’ a n a r b r e z i p p e r −> ’a narbrezipper = <f u n>