• [^] # Re: Notation do

    Posté par . En réponse au journal Compilateur et Monad Reader. Évalué à 1.

    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 (Bin o a b) = compileExpr a >> compileExpr b >> popq "%rax" >> popq "%rdx" >> asmBinop o "%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 (Bin o a b) = compileExpr a >> 
     compileExpr b >> 
     popq "%rax" >>
     popq "%rdx" >>
     asmBinop o "%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).