đ Computation expression (CE)
Computation expression
Sucre syntaxique cachant une « machinerie »
Applique la Separation of Concerns
Code + lisible à l'intérieur de la computation expression (CE)
Syntaxe : builder { expr }
builderinstance d'un Builderđexprpeut contenirlet,let!,do!,yield,yield!,return,return!
đĄ Note : seq, async et task sont des CE
Builder
Une computation expression s'appuie sur un objet appelĂ© Builder. â Cet objet permet Ă©ventuellement de stocker un Ă©tat en background.
Pour chaque mot-clé supporté (let!, return...), le Builder implémente une ou plusieurs méthodes associées. Exemples :
builder { return expr }âbuilder.Return(expr)builder { let! x = expr; cexpr }âbuilder.Bind(expr, (fun x -> {| cexpr |}))
Le builder peut également wrappé le résultat dans un type qui lui est propre :
async { return x }renvoie un typeAsync<'X>seq { yield x }renvoie un typeSeq<'X>
Builder desugaring
Le compilateur opÚre la traduction vers les méthodes du builder.
â La CE masque la complexitĂ© de ces appels, souvent imbriquĂ©s :
Exemples
logger
loggerBesoin : logguer les valeurs intermédiaires d'un calcul
ProblĂšmes â ïž
Verbeux : les
log xgĂȘnent lectureError prone : oublier un
log, logguer mauvaise valeur...
đĄ Rendre les logs implicites dans une CE lors du let! / Bind :
maybe
maybeBesoin : simplifier enchaĂźnement de "trySomething" renvoyant une Option
Bilan : â SymĂ©trie, â Valeurs intermĂ©diaires
Limites
Imbrication de CE
â On peut imbriquer des CE diffĂ©rentes â Mais code devient difficile Ă comprendre
Exemple : combiner logger et maybe â
Solution alternative :
Combinaison de CE
Combiner Async + Option/Result ? â Solution : CE asyncResult + helpers dans FsToolkit
Mis Ă jour