🚀 CE - Fondements théoriques
CE = Computation Expression
CE : le couteau suisse ✨
Les computation expressions servent à différentes choses :
C♯
yield return
→ F♯seq {}
C♯
async/await
→ F♯async {}
C♯ expressions LINQ
from... select
→ F♯query {}
...
Fondements théoriques sous-jacents :
Monoïde
Monade
Applicative
Monoïde
≃ Type T
définissant un ensemble comportant :
Opération
(+) : T -> T -> T
Pour combiner des ensembles et garder le même "type"
Associative :
a + (b + c)
≡(a + b) + c
Élément neutre (aka identity) ≃ ensemble vide
Combinable à tout ensemble sans effet
a + e
≡e + a
≡a
CE monoïdale
Le builder d'une CE monoïdale (telle que seq
) dispose a minima de :
Yield
pour construire l'ensemble élément par élémentCombine
≡(+)
(Seq.append
)Zero
≡ élément neutre (Seq.empty
)
S'y ajoute généralement (entre autres) :
For
pour supporterfor x in xs do ...
YieldFrom
pour supporteryield!
Monade
≃ Type générique M<'T>
comportant :
Fonction
return
de constructionSignature :
(value: 'T) -> M<'T>
≃ Wrap une valeur
Fonction
bind
de "liaison" (aka opérateur>>=
)Signature :
(f: 'T -> M<'U>) -> M<'T> -> M<'U>
Utilise la valeur wrappée, la "map" avec la fonction
f
vers une valeur d'un autre type et "re-wrap" le résultat
Lois
return
≡ élément neutre pour bind
À gauche :
return x |> bind f
≡f x
À droite :
m |> bind return
≡m
bind
est associatif
m |> bind f |> bind g
≡m |> bind (fun x -> f x |> bind g)
Langages
Haskell
Monades beaucoup utilisées. Les + communes :
IO
,Maybe
,State
,Reader
.Monad
est une classe de type pour créer facilement ses propres monades.
F♯
Certaines CE permettent des opérations monadiques.
Plus rarement utilisées directement (sauf par des Haskellers)
C♯
Monade implicite dans LINQ
CE monadique
Le builder d'une CE monadique dispose des méthodes Return
et Bind
.
Les types Option
et Result
sont monadiques.
→ On peut leur créer leur propre CE :
CE monadique et générique
Exemple avec le type Option
Option
CE monadiques spécifiques
☝ Recommandé car + explicite que CE monad
Applicative
A.k.a Applicative Functor
≃ Type générique M<'T>
3 "styles" :
Style B : Applicatives avec mapN
• map2
, map3
... map5
combine 2 à 5 valeurs wrappées
☝ Conseil : Styles B et C sont autant recommandés l'un que l'autre.
CE applicative
Permet d'accumuler les erreurs → Usages : • Parsing d'inputs externes • Smart constructor (Exemple de code slide suivante...)
Applicative vs Monade
Soit N opérations
tryXxx
renvoyant unOption
ouResult
Style monadique :
Avec
bind
ou CElet! ... let! ...
Chaîne les opérations, exécutée 1 à 1, la N dépendant de la N-1
S'arrête à 1ère opération KO → juste 1ère erreur dans
Result
①
Style applicatif :
Avec
mapN
ou CElet! ... and! ...
Combine 2..N opérations indépendantes → parallélisables 👍
Permet de combiner les cas
Error
contenant uneList
②
Autres CE
On a vu 2 librairies qui étendent F♯ et proposent leurs CE :
FSharpPlus →
monad
FsToolkit.ErrorHandling →
option
,result
,validation
Beaucoup de librairies ont leur propre DSL (Domain Specific Language.) Certaines s'appuient alors sur des CE :
Expecto
Farmer
Saturn
Expecto
❝ Librairie de testing : assertions + runner ❞ 🔗 https://github.com/haf/expecto
Farmer
❝ Infrastructure-as-code pour Azure ❞
Saturn
❝ Framework Web au-dessus de ASP.NET Core, pattern MVC ❞
Aller + loin
Dernière mise à jour
Cet article vous a-t-il été utile ?