Nous allons voir les foncteurs applicatifs.
Reprenons le container Maybe
Ce que j’aimerai c’est pouvoir faire ce genre d’opération
1 2 3 |
|
La bonne nouvelle c’est que c’est possible.
J’ai besoin de 2 étapes:
- Nous allons mettre en place la librairie php-functionnal. Il devient difficile d’utiliser sa propre librairie.
- Nous avons besoin d’une nouvelle opération
ap
pour applicative.
installation de php-functionnal
Grâce à composer c’est très simple.
1
|
|
Voici le fichier php dans la racine du projet
1 2 3 4 5 6 7 8 9 |
|
Si vous obtenez ceci
1 2 3 4 |
|
Tout va bien!!
Je n’ai pas utilisé les mêmes noms que la librairie voici les traductions
- Container -> Identity
- Collection -> Collection
- Some -> Just
- Nothing -> Nothing
Maybe\just(10)
est un helperMaybe\Just::of(10)
Maybe\nothing()
->Maybe\Nothing::of(10)
Nous allons faire quelque chose de curieux puisque nous ne mettons pas une valeur dans notre Maybe mais une fonction !
Regardons un exemple simple
1 2 3 4 5 |
|
Dans le premier Maybe on a mis une fonction. ap
prend en entrée un Maybe.
Nous obtenons
1 2 3 4 |
|
Essayons avec Nothing
1 2 3 |
|
Le résultat
1 2 |
|
Cela ne semble pas très utiles
Nous allons utiliser notre fonction curryN
du post précédent.
1 2 3 4 5 6 7 8 9 10 |
|
- la fonction add est une addition et prend deux arguments.
(? + ?)
- Je la transforme en évaluation partielle avec CurryN() et je la place dans un
just(? + ?)
- Au premier
ap
je soumet le premier argument, il manque encore un argument , la fonction devientjust( 5 + ?)
. - Au second
ap
l’argument manquant est fournis. La fonction est complètejust( 5 + 5)
->just(10)
.
La recette est simple, Je mets la fonction à plusieurs arguments dans mon Maybe avec le curryN. et j’applique chacun des arguments.
En fait si on fait une image
Mais nous pouvons faire cela avec toutes les fonctions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
C’est pratique car nous pouvons maintenant appliquer des fonctions à plusieurs arguments. et des fonctions qui ne travaillent pas avec des object Maybe, Nothing.
Quand on “augmente” les fonctions pour travailler avec d’autre types, on appelle cela le Lift
D’ailleurs cela s’exprime en 1 ligne avec la librairie
1 2 3 4 5 |
|
Pour résumer.
- Les functors implémentent la fonction
map
qui prend en entrée une fonction. - Les applicatives implémentent la fonction
ap
prend en entrée un applicative. Cela permet d’appliquer des fonctions à plusieurs arguments. - Les monades implémentent la fonction
bind
qui prend entrée une fonction monadique c’est à dire qui renvoie une Nomade.
Tous les monades que j’ai présenté implémentent les 3 fonctions (Maybe, Collection, Identity(Container)).
En conclusion.
Dans le prochain Post nous allons voir le cas particulier de ap
pour les collections.
- Partie 1 : Monade/Functor
- Partie 2 : Le functor Maybe
- Partie 3 : Le functor Maybe avec le Bind
- Partie 4 : Les listes
- Interlude : Les évaluations partielles
- Partie 5 : Les applicatives
- Partie 6 : Les applicatives et les listes