Envoyé par
golden boy
Ah ? Maybe et [] sont des monades ?
Oui. Une monade c'est un processus de calcul. Tu verras ça plus tard, mais l'idée est que le type te renseigne sur ce qu'on calcule.
Envoyé par
golden boy
[...] Et aussi, sur le fait qu'il faut bien renvoyer le reste de la chaîne à la fonction, pour continuer le parsing.
Exact.
Envoyé par
golden boy
Mais d'autre choses me turlupinent... Quand je prends mon caractère, je dois évaluer si c'est un opérateur ou un chiffre. Si c'est un chiffre, je dois alors vérifier qu'il n'y a pas encore de chiffre(s) derrière (gestion des nombres à plusieurs chiffres).
(si je pars de l'hypothèse que je déstructure avec le pattern (x : xs) la chaîne à parser et que je lis x).
Ah ah !!! Tu arrives à l'intérêt de considérer ton parser comme une monade. Pourquoi ? Parce que pour te simplifier la tâche tu aimerais disposer de parsers élémentaires.
Par exemple, il est utile de penser à un parser qui lit juste un chiffre. Un autre qui lit juste un opérateur serait utile. Mais à y bien penser un qui lirait n'importe quoi et renverrait le caractère serait intéressant.
Tu viens de découvrir que ton type de parser mérite d'être généralisé (paramétré)
type Parser a = String -> Maybe (a,String)
Ainsi tu définis un parser pour chaque chose qui t'intéresse. Pour toi ça veut dire un pour les chiffres, un pour les opérateurs et un pour la parenthèse ouvrante, un pour la parenthèse fermante. Tu pourras les combiner pour obtenir un parser pour les nombres, puis un autre pour chaque type d'expression... finalement tu auras ce que tu voulais en les combinant avec des choix par exemples. Bon ceci demandera des combinateurs... pour l'instant commences par les premiers (chiffres, symbole +, symbole *, parenthèse ouvrante et fermante) en produisant le code pour chaque.
Moi je te donne deux parsers important pour la suite
1 2 3 4 5 6 7 8
|
-- Le parser qui renvoie une erreur
erreur :: Parser a
erreur = \ _ -> Nothing
-- Le parser qui renvoie exactement ce qu'on lui donne
pure :: a -> Parser a
pure x = \ _ -> x |
On pourra améliorer les tiens après
Partager