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
相关产品推荐
相关产品推荐

