Je n'ai été jamais complètement convaincu par la notation do comparé à utiliser directement >>= et >>.
Cela dépend vraiment des utilisations, mais dans le cas où on fait énormément de calculs séquentiels, c'est vraiment plus clair. Par exemple, on peut imaginer (encore dans le cadre d'un compilo) écrire le code suivant
compileExpr(Binoab)=compileExpra>>compileExprb>>popq"%rax">>popq"%rdx">>asmBinopo"%rdx""%rax">>pushq"%rax"-- Or, c'est pénible à lire, pénible à modifier facilement (couper/coller des lignes, sélectionner des parties du code)-- donc on finit par écrire comme ça pour que cela soit plus pratique : compileExpr(Binoab)=compileExpra>>compileExprb>>popq"%rax">>popq"%rdx">>asmBinopo"%rdx""%rax">>pushq"%rax"-- Et on a ré-inventé la notation do en moins bien
La vraie question, c'est si on retire la notation do, pourquoi ne pas retirer les list comprehension ? Parce que c'est exactement la même chose : [ x + y | x <- [1..], y <- maListe ] est parfaitement équivalent à [1..] >>= (\x -> maListe >>= (\y -> return (x + y))) ... Je suis presque sûr que la première est bien plus claire, et bien plus utilisée, en fait, elle est même ajoutée dans des langages comme Python (qui n'a pas de monade liste explicite).
nombreuses extensions de syntaxe qui permettent d'utiliser la notation do en OCaml; j'en compte au moins 4 disponibles directement avec opam.
En effet, mais ce n'est pas intégré au langage, il faut gérer cette dépendance si on l'utilise dans un projet, et il faut sélectionner un des 4, qui sont certainement légèrement différents, ce qui demande un travail supplémentaire (et je suis flemmard).
[^] # Re: Notation do
Posté par Aluminium95 . En réponse au journal Compilateur et Monad Reader. Évalué à 1.
Cela dépend vraiment des utilisations, mais dans le cas où on fait énormément de calculs séquentiels, c'est vraiment plus clair. Par exemple, on peut imaginer (encore dans le cadre d'un compilo) écrire le code suivant
La vraie question, c'est si on retire la notation
do, pourquoi ne pas retirer leslist comprehension? Parce que c'est exactement la même chose :[ x + y | x <- [1..], y <- maListe ]est parfaitement équivalent à[1..] >>= (\x -> maListe >>= (\y -> return (x + y)))... Je suis presque sûr que la première est bien plus claire, et bien plus utilisée, en fait, elle est même ajoutée dans des langages comme Python (qui n'a pas de monade liste explicite).En effet, mais ce n'est pas intégré au langage, il faut gérer cette dépendance si on l'utilise dans un projet, et il faut sélectionner un des 4, qui sont certainement légèrement différents, ce qui demande un travail supplémentaire (et je suis flemmard).