2011-01-17 24 views
11

Soy nuevo en Haskell y estoy tratando de analizar expresiones. Me enteré de Parsec y también encontré algunos artículos, pero parece que no entiendo lo que tengo que hacer. Mi problema es que quiero dar una expresión como "x^2 + 2 * x + 3" y el resultado es una función que toma un argumento x y devuelve un valor. Lo siento mucho si esta es una pregunta fácil, pero realmente necesito ayuda. ¡Gracias! El código que inserté pertenece al artículo que puedes encontrar en this link.Función de análisis en haskell

import Control.Monad(liftM) 
import Text.ParserCombinators.Parsec 
import Text.ParserCombinators.Parsec.Expr 
import Text.ParserCombinators.Parsec.Token 
import Text.ParserCombinators.Parsec.Language 

data Expr = Num Int  | Var String | Add Expr Expr 
      | Sub Expr Expr | Mul Expr Expr | Div Expr Expr 
      | Pow Expr Expr 
      deriving Show 

expr :: Parser Expr 
expr = buildExpressionParser table factor 
    <?> "expression" 

table = [[op "^" Pow AssocRight], 
     [op "*" Mul AssocLeft, op "/" Div AssocLeft], 
     [op "+" Add AssocLeft, op "-" Sub AssocLeft]] 
    where 
     op s f assoc 
      = Infix (do{ string s; return f}) assoc 
factor = do{ char '(' 
     ; x <- expr 
     ; char ')' 
     ; return x} 
    <|> number 
    <|> variable 
    <?> "simple expression" 

number :: Parser Expr 
number = do{ ds<- many1 digit 
     ; return (Num (read ds))} 
    <?> "number" 

variable :: Parser Expr 
variable = do{ ds<- many1 letter 
     ; return (Var ds)} 
    <?> "variable" 
+0

Tengo algo que encontré en algunos artículos, pero está bien publicarlo aunque no sea mío. – izayoi

+0

por favor publíquelo ya que a otros también les puede resultar útil. Asegúrese de incluir un enlace a la fuente original. –

Respuesta

13

Esto es solo un analizador para expresiones con variables. En realidad, interpretar la expresión es un asunto completamente separado.

Debe crear una función que tome una expresión y valores ya analizados para las variables, y devuelve el resultado de evaluar la expresión. Pseudocódigo:

evaluate :: Expr -> Map String Int -> Int 
evaluate (Num n) _ = n 
evaluate (Var x) vars = {- Look up the value of x in vars -} 
evaluate (Plus e f) vars = {- Evaluate e and f, and return their sum -} 
... 

Omití deliberadamente algunos detalles; con suerte, al explorar las partes faltantes, aprenderá más sobre Haskell.

Como siguiente paso, es probable que debe buscar en el Reader mónada para un método práctico para pasar el mapa variables vars alrededor, y utilizando Maybe o Error para señalar errores, por ejemplo, haciendo referencia a una variable que no está vinculada en vars, o división por cero.

Cuestiones relacionadas