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

Haskell Parser do符号序列执行异常问题求助

问题根源与快速修复

嘿,我一眼就揪出问题所在了——你在do语法里用了全角的左箭头←,但Haskell的do notation要求的是半角的<-(减号+小于号)!这就是输出完全偏离预期的核心原因。

为什么会出现这种奇怪的输出?

Haskell允许自定义运算符,当你写x ← item时,GHC不会把它识别为do语法的绑定操作,而是把←当成一个普通的二元运算符处理。整个do块被错误解析成了一系列普通表达式的无序组合:

  • x ← item被当作独立表达式求值,后续的item、y ← item同理,最后return (x,y)把这些混乱的求值结果打包,就出现了你看到的嵌套怪异元组。

而你说>>=能正常工作,是因为你手动用的是半角符号,没有触发这个语法识别错误。

修复后的正确代码

把所有全角箭头替换成半角的<-,再补全完整的Parser定义(你之前的代码没写完):

{-# OPTIONS_GHC -fno-warn-tabs #-}
type Parser a = String -> [(a, String)]

item :: Parser Char
item = \s -> case s of
                []     -> []
                (c:cs) -> [(c, cs)]

p :: Parser (Char, Char)
p = do
  x <- item
  item
  y <- item
  return (x, y)

验证结果

现在直接运行p "abcdef"(因为Parser本身就是函数,直接调用即可),就能得到你预期的[ (('a', 'c'), "def") ]了。

小建议:平时在GHCi里开启-Wall警告(输入:set -Wall),这类语法错误会被GHC直接提示,能帮你省不少排查时间~

内容的提问来源于stack exchange,提问作者du369

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:34:08