其实我有一些公式"x + y",这是一个String.我设法x/y用特定值替换变量,例如"1.2",仍然是String类型.现在我有表达的样子"1 + 2".
所以问题是如何评估字符串类型的表达式并获得结果.
ps:我想要read,它可以直接转换整个字符串表达式,而不是逐个处理运算符(+/-等).那可能吗?
Tho*_*son 20
你的问题留下了很大的解释空间.我猜你不习惯建立整个lexing,解析,类型检查和评估的整个流程.很长的答案将涉及你定义你想要评估的语言(只是整数与'+',也许所有的理性与'+',' - ''*','/',甚至更大的语言?)并执行每个对于该语言的上述步骤.
简短的回答是:要评估Haskell表达式,其中包括您可能正在讨论的基本数学运算符,只需使用"提示"包:
$ cabal install hint
...
$ ghci
> import Language.Haskell.Interpreter
> runInterpreter $ setImports ["Prelude"] >> eval "3 + 5"
Right "8"
Run Code Online (Sandbox Code Playgroud)
好极了!
可能值得阅读真实世界Haskell的Parsec部分.您可以将其解析为表达式树,然后替换值.当您使用Parsec时,您将使用类型构建表达式树(非常粗略,我确定我犯了一些错误,我将在修复程序中编辑当人们指出他们的时候!)就像下面那样.
data Op = Plus | Minus
data Term = Variable String
| Value Int
data Expression = Expr Expression Op Expression
| Term
Run Code Online (Sandbox Code Playgroud)
然后1 + 2将是(Expr (Variable "x") Plus (Variable "y"))你可以应用适当的替换.
为了得到结果,我想你可以正确一个简单的函数evaluate :: Map String Int -> Expression -> Either ErrorMessage Int,它将在地图中应用绑定,然后在可能的情况下计算结果.