Skip to content

Instantly share code, notes, and snippets.

@jbpotonnier
Last active August 29, 2015 14:01
Show Gist options
  • Save jbpotonnier/85f0a6b3dea2c3017405 to your computer and use it in GitHub Desktop.
Save jbpotonnier/85f0a6b3dea2c3017405 to your computer and use it in GitHub Desktop.

Kata manipulation des collections en Erlang

  • Une personne est un tuple {sexe, Nom, Age}, ou sexe peut prendre les valeurs homme ou femme. Ecrire un accesseur pour le nom de la personne.

  • Créer une liste de personnes.

  • Extraire la liste des noms des personnes contenues dans la liste

    1. sans utilier lists:map
    2. puis en utilisant lists:map.
  • Ecrire les accesseurs pour les autres champs.

  • Extraire la liste des hommes

    1. sans utiliser lists:filter
    2. puis en utilisant lists:filter.
  • Ecrire une fonction calculant la somme des elements d'une liste

    1. sans utiliser les fonctions list:foldr ou list:foldl
    2. en utilisant lists:foldr
    3. Remarquer que lists:sum existe
  • Ecrire une fonction calculant l'age moyen des personnes d'une liste.

  • Ecrire une fonction pour calculer l'age moyen des hommes et des femmes d'une liste: le résultat a la forme [{homme, 30}, {femme, 10}]. Astuce : explorer les fonctions lists:partition, lists:zip, etc.

-module(collections).
-export([test_1/0, test_2/0, test_3/0, test_4/0, test_5/0, test_6/0,
test_7/0, test_8/0, test_9/0]).
nom({_, Nom, _}) -> Nom.
sexe({Sexe, _, _}) -> Sexe.
age({_, _, Age}) -> Age.
noms([]) -> [];
noms([X|XS]) -> [nom(X)|noms(XS)].
hommes([]) -> [];
hommes([X|XS]) ->
case sexe(X) of
homme -> [X|hommes(XS)];
femme -> XS
end.
somme([]) -> 0;
somme([X|XS]) -> X + somme(XS).
age_moyen(Personnes) ->
lists:sum(lists:map(fun (X) -> age(X) end, Personnes)) / length(Personnes).
test_1 () ->
P = {homme, "Jean-Baptiste", 35},
"Jean-Baptiste" = nom(P).
test_2 () ->
Personnes = [
{homme, "Pierre", 35},
{homme, "Paul", 35}
],
["Pierre", "Paul"] = noms(Personnes).
test_3 () ->
Personnes = [
{homme, "Pierre", 35},
{homme, "Paul", 35}
],
["Pierre", "Paul"] = lists:map(fun nom/1, Personnes).
test_4 () ->
Personnes = [
{homme, "Pierre", 35},
{femme, "Julie", 25},
{homme, "Paul", 35}
],
[{homme, "Pierre", 35}, {homme, "Paul", 35}] = hommes(Personnes).
test_5 () ->
Personnes = [
{homme, "Pierre", 35},
{femme, "Julie", 25},
{homme, "Paul", 35}
],
[{homme, "Pierre", 35}, {homme, "Paul", 35}] =
lists:filter(fun (X) -> sexe(X) == homme end, Personnes).
test_6 () ->
9 = somme([1, 3, 5]).
test_7() ->
9 = lists:foldr(fun (A, B) -> A + B end, 0, [1, 3, 5]).
test_8 () ->
Personnes = [
{homme, "Pierre", 30},
{femme, "Julie", 25},
{homme, "Paul", 20}
],
25.0 = age_moyen(Personnes).
test_9 () ->
Personnes = [
{homme, "Pierre", 30},
{femme, "Julie", 25},
{femme, "Marie", 75},
{homme, "Paul", 20}
],
{Hommes, Femmes} = lists:partition(fun(P) -> sexe(P) == homme end, Personnes),
[{homme, 25.0}, {femme, 50.0}] = lists:zip([homme, femme],
lists:map(fun age_moyen/1, [Hommes, Femmes])).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment