|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
Bonjour,
je suis dans l'idée d'implémenter un petit calculateur d'expression préfixe. J'ai, pour l'instant, fait un type récursif pour représenter mes expressions, ainsi que la fonction pour l'évaluer et donner le résultat (ces deux ne posent pas de problèmes) : Code :
J'avais commencé à écrire une telle fonction, mais je suis bloqué, de plus je pense ne pas utiliser la bonne voie : Code :
Merci d'avance ! |
||||
|
|
00
|
|
|
#2 |
|
Futur Membre du Club
![]() Inscription : octobre 2007 Messages : 16 ![]() |
Analyser une expression arithmétique est loin d'être évident. Il faut en effet tenir compte de la priorité des opérations, de leur associativité, du "moins" à la fois binaire et unaire etc. Les parsers monadiques sont parfaits pour résoudre ces problèmes. On peut bien sûr utiliser Parsec mais il me semble plus intéressant de créer son propre parser. Le chapitre 8 de l'excellent "programming in Haskell" de Graham Hutton est une très bonne introduction ainsi que la video http://channel9.msdn.com/Shows/Going...hapter-8-of-13 qui lui est consacré.
|
|
|
00
|
|
|
#3 |
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
Merci pour la vidéo, pour tout te dire, bien que je comprenne assez bien l'Anglais écrit, je comprends très mal l'Anglais oral, mais j'essayerai de comprendre quelque chose... (je sais que c'est mal de pas connaître l'Anglais en informatique)
|
|
|
00
|
|
|
#4 | |||||
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
Citation:
Un parser prend en entrée une chaîne de caractère (pourquoi n'as-tu pas écrit String? ça ne change rien de toute façon) et fournit en sortie ce que tu veux produire (expression pour toi) ET le reste de la chaîne de caractères qui n'a pas été traité. Le bon type (naïf) est donc Code :
Le livre de Graham Hutton est effectivement pertinent sur le sujet. C'est ce monsieur qui a produit l'idée de l'analyse syntaxe monadique (Monadic Parsing) : eprints.nottingham.ac.uk/archive/00000223/01/pearl.pdf |
|||||
|
|
20
|
|
|
#5 |
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
Euh, non... Il veut parser des expressions préfix ! Donc c'est trivial... Il faut pas dégainer les solutions de combats pour ça.
|
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
|
|
|
|
00
|
|
|
#7 | |
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
Citation:
Écrire entièrement « à la main » un parser ad-hoc, même pour une grammaire n'utilisant que des opérateurs préfixés n'est pas une bonne idée. Ce n'est pas si trivial que ça... pour preuve : il n'y arrive pas. L'évidence n'est là que pour ceux qui sont déjà aguerris. Tout à fait mon cher Dr. démon. |
|
|
|
10
|
|
|
#8 |
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
Salut,
alors en fait, je ne connais pas du tout les monades (et je suis encore loin du chapitre). On peut le faire sans monade je suppose ? |
|
|
00
|
|
|
#9 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
on peut toujours tout faire sans la "feature clé" du langage... mais dans ce cas, il faut se demander si l'on a choisi le bon langage, ou c'est juste le module en cours qui n'est pas adapté "philosophiquement" et le reste du projet qui va bien |
|
|
|
00
|
|
|
#10 |
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
Je compte bien apprendre le monades, mais pour l'instant j'en suis encore loin (je suis au chapitre 6 du RWH). Donc le mieux serait de ré-essayer d'implémenter ce parseur une fois que j'aurais appris les monades ?
|
|
|
00
|
|
|
#11 | ||||||
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
Tu n'as pas besoin des monades... mais tu retrouveras dans les monades ce que tu as élaboré.
Revenons sur ton sujet... le type de ton parser n'était pas correct. Tu aimerais qqchose du genre Code :
Code :
Code :
Laissons de côté, la gestion de l'ambiguïté (utilisation de la monade [] plutôt que la monade Maybe), le traitement des erreurs (utilisation de la monade Either plutôt que de la Monade Maybe) etc. Est-ce que ça t'aide ? |
||||||
|
|
10
|
|
|
#12 |
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
Ah ? Maybe et [] sont des monades ?
Sinon, oui ça m'a aide dans le sens où tu m'as un peu renseigné sur l'intérêt du constructeur Maybe (je ne voyais pas l'intérêt d'utiliser Just x avant, je le vois un peu mieux à présent). Et aussi, sur le fait qu'il faut bien renvoyer le reste de la chaîne à la fonction, pour continuer le parsing. 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). |
|
|
00
|
|
|
#13 | ||||
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
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.
Citation:
Citation:
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é) Code :
type Parser a = String -> Maybe (a,String) Moi je te donne deux parsers important pour la suite Code :
|
||||
|
|
10
|
|
|
#14 | |||
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
Citation:
Donc si je suis bien, l'idée c'est de faire un truc de ce genre : Code :
|
|||
|
|
00
|
|
|
#15 | |||||||
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
Citation:
Par exemple Code :
Au passage, j'avais écrit une ânerie Code :
|
|||||||
|
|
10
|
|
|
#16 |
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
Ok, je vais essayer d'écrire les petits parsers (il renvoient tous le même type ou alors tous un couple je suppose ?).
Sinon, je comprends pas trop la fonction pure, enfin son intérêt si ce n'est juste mettre sous la forme d'un couple ? (tiens, je vois que tu aimes la syntaxe OCaml pour les listes ;) ) |
|
|
00
|
|
|
#17 | ||
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
Citation:
Citation:
Au final, je te fais faire le travail décrit par Graham Hutton À force de faire du Scheme/Racket, du OCaml, du Haskell, du C++, du C et du Java régulièrement, tu finis par tout mélanger. Et c'est pourquoi je remercie de ne plus vivre au temps des punched cards. |
||
|
|
00
|
|
|
#18 |
|
Membre confirmé
![]() Étudiant Inscription : novembre 2010 Messages : 120 ![]() |
ok merci pour les précisions, je vais essayer d'implémenter tout ça dans la journée.
|
|
|
00
|
|
|
#19 |
|
Nouveau Membre du Club
![]() Inscription : octobre 2002 Messages : 36 ![]() |
Si j'étais (plus que je ne suis) débutant, je ne suis pas sûr que cette façon de voir m'éclairerait.
En même temps, dire qu'une monade est un type paramétré appartenant à la classe Monad, donc avec deux fonctions définies pour ce type: bind et return, qui de plus sont supposées obéir à quelques lois.... Ca n'aide pas non plus :-) |
|
|
00
|
|
|
#20 | |
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
Citation:
Mais encore une fois, j'admet que c'est selon les personnes. Ou dire que c'est un endofoncteur avec deux transformations naturelles d'injection et d'applanissement non plus d'ailleurs ^_^ |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com