• Aucun résultat trouvé

Fonctions d’ordre sup´erieur pr´ed´efinies Programmation Fonctionnelle Master 2 I2L apprentissage

N/A
N/A
Protected

Academic year: 2022

Partager "Fonctions d’ordre sup´erieur pr´ed´efinies Programmation Fonctionnelle Master 2 I2L apprentissage"

Copied!
20
0
0

Texte intégral

(1)

Fonctions d’ordre sup´erieur pr´ed´efinies

Programmation Fonctionnelle Master 2 I2L apprentissage

S´ebastien Verel verel@lisic.univ-littoral.fr

http://www-lisic.univ-littoral.fr/~verel

Universit´e du Littoral Cˆote d’Opale Laboratoire LISIC Equipe OSMOSE

Octobre 2016

(2)

Fonctions pr´ ed´ efinies

Dans le modulelists, plusieurs fonctions de premier ordre sont d´ej`a d´efinies car ultra-classiques et tr`es utiles.

Nous allons en d´ecouvrir quelques unes par la pratique.

Pour chacune des fonctionnelles suivantes, donner leur d´efinition et un exemple d’utilisation.

(3)

Map

map(Fun, List)

AppliqueFun`a tous les ´el´ements de la listeList.

map(_, []) -> [];

map(F, [ Head | Tail ]) -> [ F(Head) | map(F, Tail) ].

(4)

Map

map(Fun, List)

AppliqueFun`a tous les ´el´ements de la listeList.

map(_, []) ->

[];

map(F, [ Head | Tail ]) ->

[ F(Head) | map(F, Tail) ].

(5)

Filter

filter(Predicat, List)

Supprime tous les ´el´ements de la liste List qui ne v´erifie pas le pr´edicat.

filter(_, []) -> [];

filter(Pred, [H | T]) -> case Pred(H) of

true ->

[ H | filter(Pred, T) ]; false ->

filter(Pred, T) end.

(6)

Filter

filter(Predicat, List)

Supprime tous les ´el´ements de la liste List qui ne v´erifie pas le pr´edicat.

filter(_, []) ->

[];

filter(Pred, [H | T]) ->

case Pred(H) of true ->

[ H | filter(Pred, T) ];

false ->

filter(Pred, T) end.

(7)

Dropwhile

dropwhile(Predicat, List)

Supprime tous les ´el´ements en tˆete de la listeList tant que le pr´edicat est v´erifi´e.

dropwhile(_, []) -> [];

dropwhile(Pred, [H | T]) -> case Pred(H) of

true ->

dropwhile(Pred, T); false ->

[H | T] end.

(8)

Dropwhile

dropwhile(Predicat, List)

Supprime tous les ´el´ements en tˆete de la listeList tant que le pr´edicat est v´erifi´e.

dropwhile(_, []) ->

[];

dropwhile(Pred, [H | T]) ->

case Pred(H) of true ->

dropwhile(Pred, T);

false ->

[H | T]

end.

(9)

Partition

partition(Predicat, List)

Produit 2 listes l’une v´erifiant le pr´edicat, l’autre ne le v´erifiant pas.

partition(Pred, L) ->

F = fun(_, _, [], {L1,L2}) ->

{lists:reverse(L1), lists:reverse(L2)}; (Fun, Pr, [H | T], {L1,L2}) ->

case Pr(H) of true ->

Fun(Fun, Pr, T, { [H | L1], L2 }); false ->

Fun(Fun, Pr, T, { L1, [H | L2] }) end

end,

F(F, Pred, L, { [], [] }).

(10)

Partition

partition(Predicat, List)

Produit 2 listes l’une v´erifiant le pr´edicat, l’autre ne le v´erifiant pas.

partition(Pred, L) ->

F = fun(_, _, [], {L1,L2}) ->

{lists:reverse(L1), lists:reverse(L2)};

(Fun, Pr, [H | T], {L1,L2}) ->

case Pr(H) of true ->

Fun(Fun, Pr, T, { [H | L1], L2 });

false ->

Fun(Fun, Pr, T, { L1, [H | L2] }) end

end,

F(F, Pred, L, { [], [] }).

(11)

Partition

partition(Predicat, List)

Produit 2 listes l’une v´erifiant le pr´edicat, l’autre ne le v´erifiant pas.

partition(_, []) -> { [], [] };

partition(Pred, [ H | T ]) ->

{ L1, L2 } = partition(Pred, T), case Pred(H) of

true ->

{ [H | L1], L2 }; false ->

{ L1, [H | L2] } end.

(12)

Partition

partition(Predicat, List)

Produit 2 listes l’une v´erifiant le pr´edicat, l’autre ne le v´erifiant pas.

partition(_, []) ->

{ [], [] };

partition(Pred, [ H | T ]) ->

{ L1, L2 } = partition(Pred, T), case Pred(H) of

true ->

{ [H | L1], L2 };

false ->

{ L1, [H | L2] } end.

(13)

All

all(Predicat, List)

Renvoietrue lorsque le pr´edicat est v´erifi´e pour tous les ´el´ements.

all(_, []) -> true;

all(Pred, [H | T]) ->

Pred(H) andalso all(Pred, T).

(14)

All

all(Predicat, List)

Renvoietrue lorsque le pr´edicat est v´erifi´e pour tous les ´el´ements.

all(_, []) ->

true;

all(Pred, [H | T]) ->

Pred(H) andalso all(Pred, T).

(15)

Any

any(Predicat, List)

Renvoietrue lorsque le pr´edicat est v´erifi´e pour l’un des ´el´ements.

any(_, []) -> false;

any(Pred, [H | T]) ->

Pred(H) orelse any(Pred, T).

(16)

Any

any(Predicat, List)

Renvoietrue lorsque le pr´edicat est v´erifi´e pour l’un des ´el´ements.

any(_, []) ->

false;

any(Pred, [H | T]) ->

Pred(H) orelse any(Pred, T).

(17)

Fold left

foldl(Fun, Accumulateur, List)

Fun est une fonction `a deux variables. La fonction Funrenvoie la nouvelle de l’accumulateur apr`es l’avoir appliqu´ee sur la tˆete et l’accumulateur.foldl applique r´ecursivement de gauche `a droite la fonctionFun aux ´el´ements de la liste `a partir de la valeur initiale donn´ee de l’accumulateur.

Penser `a la somme, au maximum, `a la concat´enation, etc.

foldl(Fun, Acc, []) when is_function(Fun, 2) -> Acc;

foldl(Fun, Acc, [H | T]) -> foldl(Fun, Fun(H, Acc), T).

(18)

Fold left

foldl(Fun, Accumulateur, List)

Fun est une fonction `a deux variables. La fonction Funrenvoie la nouvelle de l’accumulateur apr`es l’avoir appliqu´ee sur la tˆete et l’accumulateur.foldl applique r´ecursivement de gauche `a droite la fonctionFun aux ´el´ements de la liste `a partir de la valeur initiale donn´ee de l’accumulateur.

Penser `a la somme, au maximum, `a la concat´enation, etc.

foldl(Fun, Acc, []) when is_function(Fun, 2) ->

Acc;

foldl(Fun, Acc, [H | T]) ->

foldl(Fun, Fun(H, Acc), T).

(19)

Fold right

foldr(Fun, Accumulateur, List)

Fun est une fonction `a deux variables. La fonction Funrenvoie la nouvelle de l’accumulateur apr`es l’avoir appliqu´ee sur la tˆete et l’accumulateur.foldr applique r´ecursivement de droite `a gauche la fonctionFun aux ´el´ements de la liste `a partir de la valeur initiale donn´ee de l’accumulateur.

foldr(Fun, Acc, []) when is_function(Fun, 2) -> Acc;

foldr(Fun, Acc, [H | T]) -> Fun(H, foldr(Fun, Acc, T)).

(20)

Fold right

foldr(Fun, Accumulateur, List)

Fun est une fonction `a deux variables. La fonction Funrenvoie la nouvelle de l’accumulateur apr`es l’avoir appliqu´ee sur la tˆete et l’accumulateur.foldr applique r´ecursivement de droite `a gauche la fonctionFun aux ´el´ements de la liste `a partir de la valeur initiale donn´ee de l’accumulateur.

foldr(Fun, Acc, []) when is_function(Fun, 2) ->

Acc;

foldr(Fun, Acc, [H | T]) ->

Fun(H, foldr(Fun, Acc, T)).

Références

Documents relatifs

Pour chacune des fonctionnelles suivantes, donner leur d´ efinition et un exemple d’utilisation... La fonction f renvoie la nouvelle valeur de l’accumulateur apr` es l’avoir

´ el´ ements plus petit que l’´ etiquette sont dans l’arbre gauche et tous les ´ el´ ements plus grand que l’´ etiquette sont dans l’arbre droit. searchOrd _ Empty

L’insertion et la suppression utilisent la rotation ` a gauche et ` a droite d’un arbre lorsqu’il est trop d´ es´ equilibr´ e :.

´ el´ ements plus petit que l’´ etiquette sont dans l’arbre gauche et tous les ´ el´ ements plus grand que l’´ etiquette sont dans l’arbre droit. searchOrd :: (Ord a) =>

Motif : expression compos´ e de variables libres ou li´ ees, ainsi que des valeurs litt´ erales (atomes, entiers ou chaines) Expression : expression compos´ e de structures de

Est-il possible de r´ esoudre le probl` eme ` a l’aide de la r´ esolution du probl` eme portant sur une (des) ”plus petite(s)” valeur(s) du param` etre. Si oui,

Connaitre le sch´ ema r´ ecursif du traitement d’une liste Connaitre les algorithmes classiques relatifs aux listes Savoir ´ ecrire une fonction de calcul avec accumulateur, de

Calcul consiste en l’´ evaluation d’une fonction pour ´ eviter toute modification ”d’´ etats”.. R´ esultat d´ epend seulement des entr´ ees et non pas de l’´ etat