You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell实现指定语言解释器单目运算输出错误求助

修复方案

你遇到的问题由三个错误共同导致:

  1. 你编写的单目运算符处理逻辑被块注释包裹,完全没有生效。当前所有运算节点都走双目运算分支,foldl1处理单元素列表时会直接返回元素本身,所以(-4)返回4.0、(/2)返回2.0,和你的错误输出完全匹配。
  2. 你注释的单目运算代码本身存在类型错误:参数p是语法树节点,需要先调用eval求值才能参与数值计算,否则会直接触发编译报错。
  3. 代码中存在多余的非法行 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:15:05