Ajouter un commentaire

fredericmazue

Bel effort :)
Je pense que ton document évitera à bien des programmeurs impératifs de buter dans l'apprentissage d'Haskell. Je n'ai pas tout lu très attentivement, faute de temps, mais je ne pense pas avoir vu de "bourdes" :)
Une remarque si tu me le permets. Tu t'es lancé dans le difficile exercice d'expliquer la monade à partir de la monade IO qui est très particulière (avec état et opaque). Ca sera peut être bien d'expliquer déjà la monade en tant que telle, vu que IO est un cas très particulier. Sur le fond tout ce que tu dis dans ce chapitre est ok pour moi, mais il y a une imprécision je pense. C'est page 19 "The ’<-’ arrow is used to bind the result of an IO operation to a variable. ’getLine’ has a type of ’IO String’. The
’do’ notation says that a monad function like ’getLine’ can be prefaced by a variable name and the left arrow. That variable name comes into scope at that point in the function and when the monad function is evaluated, and its return value will be assigned to the variable."

Normalement tu ne peux pas dire que <- crée un binding. C'est une illusion d'optique induite pas les sucres syntaxiques do et <-
Comme tu le sais, ce qui se passe, c'est :

getLine >>= \name -> putStrLn name

Donc name est "foncteurisé" (je ne sais pas comment faudrait expliquer ça en anglais) par la fonction/foncteur >>= de la monade qui s'appelle malencontreusement bind. Mais il n'y a pas de binding sur name. Pour preuve le code suivant est légal:

main = do
  name <- getLine
  name <- getLine

Alors que s'il y avait un binding, il ne le serait pas.
C'est même un des gros intérêts de la monade, car cela permet à un compilateur malin de faire des update destructifs dans un contexte purement fonctionnel. Chose qui ne peut exister dans des langages "ML" dépourvus de monades
De même à propos de getLine, dans la phrase citée ci-dessus, tu dis "its return value will be assigned to the variable"
En fait non. La valeur de retour de getLigne c'est IO String, pas String et IO String ne peut pas être assignée. Ce qui se passe, c'est que le String de IO String est foncteurisé dans le contexte de la monade IO. Ce n'est pas vraiment la même chose.

Bon maintenant avec ce que je viens de dire, personne débutant en Haskell ne va avoir une idée claire de ce qu'est la monade, alors qu'avec ce que tu as dit on en a une bonne idée malgré tout. Pour sûr qu'expliquer ça n'est pas facile. Mais je crois vraiment d'expliquer monade et monade à état avant IO serait mieux. Le bât blessant par le fait que c'est à IO qu'on est confronté dès qu'on écrit le moindre Hello World. :(

Ah... vulgariser est un exercice difficile, je suis bien placé pour le savoir. On est bien d'accord que mes remarques n'enlèvent rien au formidable travail que tu as fait n'est-ce pas ?

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 RRRR   FFFF   AA   TTTTTT  TTTTTT 
R R F A A TT TT
RRRR FFF AAAA TT TT
R R F A A TT TT
R RR F A A TT TT