Les Monades: Applicative et les listes

Dans le précédent post, j’avais parlé des applicatives sur les Maybes.

Nous allons voir ensemble comment les applicatives se comportent sur les listes.

Rappelons que l’idée des applicatives c’est

  • ma valeur est dans un container
  • et ma fonction que je vais appliquer est aussi dans un container

Pour la liste c’est un peu près la même idée.

  • mes valeurs sont dans une collection
  • mes fonctions sont aussi dans une collection

Initialisons une Collection de valeurs

1
$collectionValue = Monad\Collection::of([1, 2]);

Créons un collection de fonctions

1
2
3
4
5
6
7
8
$collection = Monad\Collection::of([
    function($a) {
        return 3 + $a;
    },
    function($a) {
        return 4 + $a;
    },
]);

Regardons de suite le résultat, nous obtenons une collection qui contient [4, 5, 5, 6]. En fait on a calculé toutes les possibilités.. Puisque [1+3, 1+4, 2+3, 2+4]

Essayons de programmer un générateur de nom de scout (?!!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// des animaux
$collectionAnimaux = Monad\Collection::of([
  "renard",
  "blaireau",
  "aigle",
  "panda"
]);

// des adjectifs
$collectionAdjectif =  Monad\Collection::of([
  "affectueux",
  "perçant",
  "agile",
  "bavard"
]);

// des générateurs
$collectionGenerateur = Monad\Collection::of([
    Maybe\just(
        f\curryN(
            2, function($nom,$adj) {return $nom . " " . $adj;}
        )
        ),
    Maybe\just(
        f\curryN(
            2, function($nom,$adj) {return "petit ". $nom . " " . $adj;}
        )
    )

   ]
);

// On mélange
var_dump($collectionGerateur->ap($collectionAnimaux)->ap($collectionAdjectif));

Grâce à l’évaluation partielle je peux créer des fonctions à plusieurs arguments. Les applicatives sur les listes me permette de faire toutes les combinaisons.

J’obtiens

1
2
3
4
5
6
7
8
9
10
11
12
 .. 32 résultats
 string(14) "panda perçant"
    [14] =>
    string(11) "panda agile"
    [15] =>
    string(12) "panda bavard"
    [16] =>
    string(23) "petit renard affectueux"
    [17] =>
    string(21) "petit renard perçant"
    [18] =>
    string(18) "petit renard agile"

Bon c’est sur que petit renard affectueux n’est pas génial comme nom..

Le Panda bavard.

Liste des articles