Programmation Fonctionnelle Avancée
Structures persistantes
Files
Files impératives II
l e t add a f = match f . l a s t with
| Vide −>(∗f . f i r s t d o i t e t r e Vide a u s s i ∗)
f . f i r s t <−Cons ( a , ref V i de ) ;
f . l a s t <−f . f i r s t ;
| Cons (_, r ) −> r := Cons ( a , ref Vi d e ) ;
f . l a s t <−! r
l e t remove f = match f . f i r s t with
| Vide −> r a i s e Empty
| Cons ( a , r ) −>
i f f . l a s t = f . f i r s t then f . l a s t <−! r ;
f . f i r s t <−! r ; a
end ; ;
Programmation Fonctionnelle Avancée
Structures persistantes
Files
Files imperatives
Temps d’insertion et extraction constant, mais ce n’est pas une
structure de donnée persistante !
open FifoImp ;;
let f = c r e a t e ( ) ; ;
add 3 f ; ;
|| −: u n i t = ( )
f ; ;
|| −: i n t F ifoI m p . t =
|| { f i r s t = Cons ( 3 , { c o n t e n t s = V id e } ) ; l a s t = Cons ( 3 , { c o n t e n t s = V id e })
|| }
add 4 f ; ;
|| −: u n i t = ( )
f ; ;
|| −: i n t F ifoI m p . t =
|| { f i r s t = Cons ( 3 , { c o n t e n t s = Cons ( 4 , { c o n t e n t s = V id e } ) } ) ;
|| l a s t = Cons ( 4 , { c o n t e n t s = V id e }) }
remove f ; ;
|| −: i n t = 3
f ; ;
|| −: i n t F ifoI m p . t =
|| { f i r s t = C ons ( 4 , { c o n t e n t s = V id e } ) ; l a s t = Cons ( 4 , { c o n t e n t s = V id e })
|| }
Programmation Fonctionnelle Avancée
Structures persistantes
Files
Files fonctionnelles efficaces I
Implémentation
module FifoDL : FIFO = struct
exception Empty
type ’ a t = ’ a l i s t ∗’ a l i s t
l e t empty = ( [ ] , [ ] )
l e t is_empty =
fu n cti o n
([] ,[]) −>true
| _ −>f a l s e
Programmation Fonctionnelle Avancée
Structures persistantes
Files
Files fonctionnelles efficaces II
l e t add x ( l1 , l 2 ) = ( x : : l1 , l 2 )
l e t remove ( l1 , l 2 ) = match l 2 with
| a : : l −> ( a , ( l 1 , l ) )
| [ ] −>match L i s t . r e v l 1 with
| [ ] −> r a i s e Empty
| a : : l −> ( a , ( [ ] , l ) )
end ; ;
Est-ce efficace ? remove appelle List.rev !