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
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.
Map
map(Fun, List)
AppliqueFun`a tous les ´el´ements de la listeList.
map(_, []) -> [];
map(F, [ Head | Tail ]) -> [ F(Head) | map(F, Tail) ].
Map
map(Fun, List)
AppliqueFun`a tous les ´el´ements de la listeList.
map(_, []) ->
[];
map(F, [ Head | Tail ]) ->
[ F(Head) | map(F, Tail) ].
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.
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.
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.
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.
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, { [], [] }).
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, { [], [] }).
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.
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.
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).
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).
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).
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).
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).
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).
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)).
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)).