11.07.2015 Views

Programmation fonctionnelle (Haskell)

Programmation fonctionnelle (Haskell)

Programmation fonctionnelle (Haskell)

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

eprn : : Queue a −> [ a ]reprn empty = [ ]reprn ( join x xq ) = reprn xq ++ [ x ]Une solution alternative est de représenter une queue xq par une paire delistes (xs,ys) tant que les éléments de xq comprennent les éléments de la listexs++ reverse ys. En plus, nous imposons sur la représentation l’invariantev a l i d : : ( [ a ] , [ a ] ) −> Boolv a l i d ( xs , ys ) = not ( null xs ) | | null ysOn pourrait définir la fonction abstr commea b s t r : : ( [ a ] , [ a ] ) −> Queue aa b s t r ( xs , ys ) = ( foldr join empty . reverse ) ( xs ++ reverse ys )On observe que cette fonction n’est pas inversive : il n’y a pas de correspondanceune-à-une entre une que et la représentation par paire et on ne peut donc pasdéfinir reprn. L’implémentationemptyc = ( [ ] , [ ] )isEmptyc ( xs , ys ) = null xsj o i n c x ( ys , zs ) = mkValid ( ys , x : zs )f r o n t c ( x : xs , ys ) = xbackc ( x : xs , ys ) = mkValid ( xs , ys )mkValid : : ( [ a ] , [ a ] ) −> ( [ a ] , [ a ] )mkValid ( xs , ys ) = i f null xs then ( reverse ys , [ ] )else ( xs , ys )Les opérations d’un TDA peuvent être organisées dans une module :module Queue ( Queue , empty , isEmpty , join , front , back ) wherenewtype Queue a = MkQ ( [ a ] , [ a ] )empty : : Queue aempty = MkQ ( [ ] , [ ] )isEmpty : : Queue a −> BoolisEmpty (MkQ ( xs , ys ) ) = null xsjoin : : a −> Queue a −> Queue ajoin x (MkQ ( ys , zs ) ) = mkValid ( ys , x : zs )f r o n t : : Queue a −> af r o n t (MkQ ( xs , ys ) ) = xback : : Queue a −> Queue aback (MkQ ( x : xs , ys ) ) = mkValid ( xs , ys )24

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!