11

私はHaskellを初めて使用し、式を解析しようとしています。パーセクについて知り、いくつかの記事も見つけましたが、自分が何をしなければならないのか理解していないようです。私の問題は、「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"
4

1 に答える 1

12

これは、変数を持つ式の単なるパーサーです。実際に表現を解釈することは完全に別の問題です。

すでに解析された式と変数の値を取り、式の評価結果を返す関数を作成する必要があります。擬似コード:

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する便利な方法を探す必要があります。たとえば、にバインドされていない変数を参照したり、ゼロで除算したりします。varsMaybeErrorvars

于 2011-01-17T11:36:12.673 に答える