2010-04-01 8 views
1

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

+0

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

+0

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

Répondre

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