【发布时间】:2020-03-28 13:39:44
【问题描述】:
我正在尝试为语法树算术运算创建一个函数,到目前为止,我几乎达到了我想要的位置。在我附加的代码中,您可以看到我当前的函数定义。 eval 是决定如何处理每个操作的函数,foldAndPropagateConstants 是主要函数。 parse 是一个简单的解析器,它接受数学表达式的 String 并返回等效的树。例如
ghci> parse "3+x"
BinaryOperation Plus (Leaf (Constant 3)) (Leaf (Variable "x"))
我面临的问题是如何将评估值用于后续操作。例如,这个操作应该如下工作:
ghci> foldAndPropagateConstants [("x", parse "1+2+3"), ("y", parse "5*x + 7")]
[("x",Leaf (Constant 6)),("y",Leaf (Constant 37))]
请注意,在计算"y" 的值时,该函数应使用"x" 获得的值。问题是,我似乎找不到在我的 eval 函数中使用 "x" 值的方法。
--foldAndPropagateConstants :: [(String, Exprv)] -> [(String, ExprV)]
eval :: ExprV -> Int
eval (Leaf (Variable n)) = --this part is what's missing
eval (Leaf (Constant n)) = n
eval (BinaryOperation Plus expr1 expr2) = eval expr1 + eval expr2
eval (BinaryOperation Times expr1 expr2) = eval expr1 * eval expr2
eval (UnaryOperation Minus expr1) = -1 * eval expr1
foldAndPropagateConstants (x:xs) = [(fst x, parse (show (eval(snd x)))) ] : foldAndPropagateConstants xs
foldAndPropagateConstants _ = []
【问题讨论】:
-
通常这是通过将“环境”参数添加到
eval来完成的,该参数存储所有变量的值,如Data.Map或类似名称。 -
可能应该指出我对 Haskell 很陌生。不知道该怎么做。 @luqui
-
向函数的类型和定义添加参数是您可以通过阅读任意数量的资源来学习的内容。
-
正如@luqui 所说,最好使用List 或Map 等环境,在其中存储变量及其值
标签: list function parsing haskell evaluation