đ 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 -> TPour 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 :
Yieldpour construire l'ensemble Ă©lĂ©ment par Ă©lĂ©mentCombineâĄ(+)(Seq.append)Zero⥠élĂ©ment neutre (Seq.empty)
S'y ajoute généralement (entre autres) :
Forpour supporterfor x in xs do ...YieldFrompour supporteryield!
Monade
â Type gĂ©nĂ©rique M<'T> comportant :
Fonction
returnde constructionSignature :
(value: 'T) -> M<'T>â Wrap une valeur
Fonction
bindde "liaison" (aka opérateur>>=)Signature :
(f: 'T -> M<'U>) -> M<'T> -> M<'U>Utilise la valeur wrappée, la "map" avec la fonction
fvers 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.Monadest 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
Librairie LanguageExt de programmation fonctionnelle
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
FSharpPlus propose une CE monad
â Marche pour tous les types monadiques : Option, Result, ... et mĂȘme Lazy !
Exemple avec le type Option
Optionâ ïž Limite : on ne peut pas mĂ©langer plusieurs types monadiques !
CE monadiques spécifiques
Librairie FsToolkit.ErrorHandling propose :
⹠CE option {} spécifique au type Option<'T> (exemple ci-dessous)
⹠CE result {} spécifique au type Result<'Ok, 'Err>
â RecommandĂ© car + explicite que CE monad
Applicative
A.k.a Applicative Functor
â Type gĂ©nĂ©rique M<'T>
3 "styles" :
Style A : Applicatives avec apply/<*> et pure/return
âą â Pas facile Ă comprendre
âą đĄ PrĂ©sentĂ© par JĂ©rĂ©mie Chassaing dans le talk âApplicatives in real lifeâ
âą â DĂ©conseillĂ© par Don Syme dans cette note de nov. 2020
Style B : Applicatives avec mapN
⹠map2, map3... map5 combine 2 à 5 valeurs wrappées
Style C : Applicatives avec let! ... and! ... dans une CE
âą MĂȘme principe : combiner plusieurs valeurs wrappĂ©es
⹠Disponible à partir de F⯠5 (annonce de nov. 2020)
â Conseil : Styles B et C sont autant recommandĂ©s l'un que l'autre.
CE applicative
Librairie FsToolkit.ErrorHandling propose :
⹠Type Validation<'Ok, 'Err> ⥠Result<'Ok, 'Err list>
âą CE validation {} supportant syntaxe let!...and!...
Permet d'accumuler les erreurs â Usages : âą Parsing d'inputs externes âą Smart constructor (Exemple de code slide suivante...)
Applicative vs Monade
Soit N opérations
tryXxxrenvoyant unOptionouResult
Style monadique :
Avec
bindou 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âRailway-oriented programming de Scott Wlaschin
Style applicatif :
Avec
mapNou CElet! ... and! ...Combine 2..N opĂ©rations indĂ©pendantes â parallĂ©lisables đ
Permet de combiner les cas
Errorcontenant uneListâĄ
Autres CE
On a vu 2 librairies qui étendent F⯠et proposent leurs CE :
FSharpPlus â
monadFsToolkit.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 â
đ github.com/compositionalit/farmer
Saturn
â Framework Web au-dessus de ASP.NET Core, pattern MVC â
đ saturnframework.org
Aller + loin
đč Extending F# through Computation Expressions - đ Slides
Last updated
Was this helpful?