Haskell实现指定语言解释器单目运算输出错误求助
修复方案
你遇到的问题由三个错误共同导致:
- 你编写的单目运算符处理逻辑被块注释包裹,完全没有生效。当前所有运算节点都走双目运算分支,
foldl1处理单元素列表时会直接返回元素本身,所以(-4)返回4.0、(/2)返回2.0,和你的错误输出完全匹配。 - 你注释的单目运算代码本身存在类型错误:参数
p是语法树节点,需要先调用eval求值才能参与数值计算,否则会直接触发编译报错。 - 代码中存在多余的非法行
functions here.,会导致编译失败。
具体修改
把eval函数和相邻的无效行替换为以下代码:
eval :: ParseTree -> Double eval (NumNode x) = x -- 单目运算符处理 eval (OpNode c [p]) | c == '/' = 1 / eval p | c == '-' = - eval p eval (OpNode c pts) = foldl1 (charToFunction c) (map eval pts) charToFunction :: Char -> (Double -> Double -> Double) charToFunction '+' = (+) charToFunction '-' = (-) charToFunction '*' = (*) charToFunction '/' = (/) charToFunction _ = error "Invalid operator specified"
验证
修改后执行测试用例:
interpret "(- 4)"输出-4.0,符合预期interpret "(/ 2)"输出0.5,符合预期
补充说明:你输入的(/2)、(-4)因为运算符和数字之间没有空格,标准库lex会把它们识别为同一个词素,你现有的scan逻辑会把运算符后的数字重新塞回待扫描串,所以可以正常识别,不需要额外修改。
内容的提问来源于stack exchange,提问作者kimmieRak2
相关产品推荐
相关产品推荐

