J'écris une fonction de lecture personnalisée pour l'un des types de données de mon module. Par exemple, quand je fais read "(1 + 1)" :: Data
, je veux qu'il retourne Plus 1 1
. Ma déclaration de données est data Data = Plus Int Int
. MerciCorrespondance de modèle pour la fonction de lecture personnalisée
1
A
Répondre
2
Vous pouvez utiliser ReadP de GHC.
6
Cela ressemble à quelque chose de mieux adapté à un analyseur; Parsec est une puissante bibliothèque de combinateurs Haskell, que je recommanderais.
3
Je voudrais appuyer la notion d'utilisation d'un analyseur. Cependant, si vous devez absolument utiliser un pattern-matching, allez comme ceci:
import Data.List
data Expr = Plus Int Int | Minus Int Int deriving Show
test = [ myRead "(1 + 1)", myRead "(2-1)" ]
myRead = match . lexer
where
match ["(",a,"+",b,")"] = Plus (read a) (read b)
match ["(",a,"-",b,")"] = Minus (read a) (read b)
match garbage = error $ "Cannot parse " ++ show garbage
lexer = unfoldr next_lexeme
where
next_lexeme "" = Nothing
next_lexeme str = Just $ head $ lex str
Questions connexes
- 1. Correspondance de modèle Python
- 2. AIML correspondance de modèle - howto?
- 3. NSString simple correspondance de modèle
- 4. Correspondance de modèle T-SQL
- 5. correspondance de modèle dans le paramètre formel de la définition de fonction
- 6. Définition de la fonction de hachage personnalisée et de la fonction d'égalité pour unordered_map
- 7. Correspondance de modèle à l'aide de décorateurs
- 8. correspondance de modèle de script shell?
- 9. Correspondance d'un nom de fonction
- 10. Substitution de variable dans la correspondance de modèle?
- 11. Lecture de l'exécution de la fonction
- 12. Lecture personnalisée HttpWebResponse StatusDescription?
- 13. définition de la fonction VIM personnalisée/emplacement
- 14. fonction de lecture - FileSystemObject
- 15. xsl: la correspondance de modèle ne trouve pas les correspondances
- 16. Fonction is_category pour les termes de la taxonomie personnalisée
- 17. Extension Flex DataGridColumn pour la fonction de tri personnalisée
- 18. SlideDown puis appel de la fonction personnalisée
- 19. Fonction pour trouver et renvoyer la correspondance d'une expression régulière
- 20. Fonction pour trouver la correspondance exacte dans Microsoft SQL Server
- 21. spécialisation de la fonction de modèle pour l'interface spécifique
- 22. F # correspondance explicite vs syntaxe de la fonction
- 23. Comment faire une correspondance de modèle en Common Lisp
- 24. Il y a une fonction pour utiliser la correspondance de modèle (en utilisant des expressions régulières) en C++?
- 25. Remplacement de Clojure pour les ADT et la correspondance de modèle?
- 26. Comment fonctionne ce modèle de correspondance de classe de cas?
- 27. C# Correspondance de modèle de table de hachage
- 28. adresse de la fonction de modèle C++
- 29. preg_replace passe par correspondance avant de remplacer la fonction
- 30. Comment configurer cette fonction de correspondance de regex javascript?
Je ne suis pas sûr de savoir quelle est la question ici. Votre sujet mentionne l'appariement de motifs, mais pas le corps de la question. Vous dites que vous écrivez une fonction de lecture personnalisée, mais vous ne dites pas quel problème vous avez rencontré. – sepp2k
le problème est que je veux faire un motif correspondant à la chaîne. Par exemple: si la chaîne est "(1 + 1)" alors elle retournera Plus 1 1. Si elle est "(2 - 1)", elle renvoie Moins 2 1. Les opérateurs peuvent être + - * /. Et les opérandes peuvent être des entiers. Mais l'opérateur doit être délimité par des espaces et il doit y avoir des parenthèses délimitées par l'ensemble de l'expression. – altair211