Bon alors... Mon premier contact avec Haskell, je dois vous dire... Je ne suis pas vraiment impressionné·e... 
@Ambraven arf, pourtant haskell c'est la vie T^T
@wryk Mais je comprend rien à l'export/import de modules T_T
@wryk c'est ce que je suis en train de parcourir...
@wryk c'est une instance de Show qui me pose problème.
@Ambraven tu as un gist de ton module ?
@Ambraven @wryk Viendez coder et réfléchir au mercawe avec nous les gens :
https://mensuel.framapad.org/p/1ciLFLA9bg
(il y a le lien de mon dépôt dessus)
@Ambraven @wryk Qu'est-ce qui t'embête ? C'est une broutille, je voulais juste que ça montre les mots tels qu'on les aurait écrit en tant qu'humain et pas avec leur représentation de base en Haskell, on peut le laisser tout dériver si tu préfères.
Du coup ce qui t'embête c'est plus le concept de TypeClass et d'instance que de module non ? (les modules c'est les fichiers qui exportent des types et des valeurs)
@Sasha @wryk ce qui m'embête, c'est que j'arrive pas à faire fonctionner "show generate" dans Main.hs
( "main = generate" ne renvoie rien et "putStrLn generate" ne fonctionne pas parce que generate ne renvoie pas une string... )
C'est moi qui galère avec le langage, pas un problème fondamentale avec ton implémentation à priori.
@Ambraven @wryk Oui c'est un problème avec la monade IO. Ça peut dérouter au début, c'est normal, d'autant plus qu'être dans un toplevel donc un truc assez impératif dans l'idée n'aide pas vu que c'est fondamentalement une exception par rapport à un programme normal.
Alors déjà l'idée du toplevel ghci, c'est justement qu'il essaye de te montrer tout les résultats qu'il évalue donc si tu lui donnes à manger un truc instance de show, il va utiliser show automatiquement.
Ensuite, comme j'ai dit fondamentalement c'est impératif et c'est pour ça que tu peux écrire une expression de type IO a, et il va l'évaluer. Du coup t'as besoin de rien, juste «generate».
@Ambraven @wryk Je pensais le faire, j'attendais de voir si c'était utile, comment tu voulais t'en servir, bref, ce qu'on faisait de ma toute petit ébauche de quelque chose.
En tout cas c'est bien tu vas comprendre direct les monades : dans mon message précédent, tu dois te dire «c'est dommage, ça marcherait presque d'appliquer putStrLn à generate, si ce satané generate n'était pas pourri par le IO autour». C'est justement le sens de l'opérateur «bind» : l'application dans une monade :
>>= :: IO a -> (a -> IO b) -> IO b
d'où generate >>= putStrLn :: IO ()
décidément je suis largué·e...
Main.hs:5:22: error:
* Couldn't match type `Vocabulary.Word' with `[Char]'
Expected type: Vocabulary.Word -> IO ()
Actual type: String -> IO ()
* In the second argument of `(>>=)', namely `putStrLn'
In a stmt of a 'do' block: generate >>= putStrLn
In the expression:
do { generate >>= putStrLn;
putStrLn "hello" }
( non le putStrLn "hello" ne sert à rien... )
@wryk @Ambraven c.f. la session de démo que j'ai ajouté dans le README.txt en fait.
Et effectivement `putStrLn generate` n'a pas de sens parce que l'expression est mal typée :
putStrLn :: String -> IO ()
attends une chaîne en argument, et fera une opération de type unit, dans la monade IO (provoquant un effet de bord), alors que
generate :: IO String
renvoie une chaîne de caractères, mais «salie» par la monade IO (parce que pour l'obtenir, il a fallu faire un effet de bord : consommer des valeurs du générateur aléatoire, donc modifier son état).
@Ambraven c'est un point particulier ou l'ensemble qui te pose un soucis ?
Je peux p-e te faire un exemple pour essayer de te débloquer