githubModifier

🚀 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 }

  • builder instance d'un Builder📍

  • expr peut contenir let, 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 type Async<'X>

  • seq { yield x } renvoie un type Seq<'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

Besoin : logguer les valeurs intermédiaires d'un calcul

ProblĂšmes ⚠

  1. Verbeux : les log x gĂȘnent lecture

  2. Error prone : oublier un log, logguer mauvaise valeur...

💡 Rendre les logs implicites dans une CE lors du let! / Bind :

maybe

Besoin : 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 FsToolkitarrow-up-right

Mis Ă  jour