gpt4 book ai didi

Haskell中的解析函数

转载 作者:行者123 更新时间:2023-12-02 08:49:59 24 4
gpt4 key购买 nike

我是 Haskell 新手,我正在尝试解析表达式。我发现了秒差距,也找到了一些文章,但我似乎不明白我必须做什么。我的问题是我想给出一个像“x^2+2*x+3”这样的表达式,结果是一个接受参数 x 并返回一个值的函数。如果这是一个简单的问题,我很抱歉,但我真的需要一些帮助。谢谢!我插入的代码来自您可以在this link上找到的文章.

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,以方便地传递变量映射 vars,并使用 MaybeError 来表示错误,例如引用未在 vars 中绑定(bind)或除以零的变量。

关于Haskell中的解析函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com