簡體   English   中英

haskell中的解析函數

[英]Parsing function in haskell

我是Haskell的新手,我正在嘗試解析表達式。 我發現了Parsec,我也發現了一些文章,但我似乎不明白我必須做什么。 我的問題是我想給出一個像“x ^ 2 + 2 * x + 3”這樣的表達式,結果是一個帶參數x並返回一個值的函數。 如果這是一個簡單的問題,我很抱歉,但我真的需要一些幫助。 謝謝! 我插入的代碼來自您可以在此鏈接上找到的文章。

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"

這只是帶變量的表達式的解析器。 實際上,解釋表達是一個完全獨立的問題。

您應該創建一個函數,該函數接受已經解析的表達式和變量值,並返回計算表達式的結果。 偽代碼:

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 -}
...

我故意省略了一些細節; 希望通過探索缺失的部分,您可以了解有關Haskell的更多信息。

下一步,您應該查看Reader monad,以便方便地傳遞變量map vars ,並使用MaybeError來表示錯誤,例如引用未綁定在vars中的vars ,或者除以零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM