Haskell:模式中的解析错误

Posted

技术标签:

【中文标题】Haskell:模式中的解析错误【英文标题】:Haskell: Parse error in pattern 【发布时间】:2012-01-23 14:36:34 【问题描述】:

谁愿意告诉我这段代码有什么问题(语法上)?

-- merge two sorted lists
mergeX [] b res = b ++ res
mergeX a [] res = a ++ res
mergeX a:as b:bs res
    | a > b     = mergeX as b:bs a:res
    | otherwise = mergeX a:as bs b:res

翻译:

模式中的解析错误:mergeX

【问题讨论】:

【参考方案1】:

你需要一些括号:

mergeX [] b res = b ++ res
mergeX a [] res = a ++ res
mergeX (a:as) (b:bs) res
    | a > b     = mergeX as (b:bs) (a:res)
    | otherwise = mergeX (a:as) bs (b:res)

原因是因为:的优先级低于函数应用,所以mergeX a:as b:bs res会被解析为:

(mergeX a):(as b):(bs res)

这是一个错误。

【讨论】:

谢谢,我记得我有过某事。像以前那样;)。你通常总是使用 (x:xs) 而不是 x:xs 来防止错误吗? @user905686:在一个模式中,是的。【参考方案2】:

您需要将构造函数模式(或者无论它们如何调用)放在括号中。

mergeX (a:as) (b:bs) res 

【讨论】:

以上是关于Haskell:模式中的解析错误的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 布尔表达式:解析错误(可能不正确的缩进或不匹配的括号)

分析使用 Haskell 中的解析器组合库编写的解析器

导入 GraphQL 解析器和模式触发错误

如何在资源有限的 Haskell 中解析大型 XML 文件?

Nodejs用严格模式解析dom错误

NestJS 5 GraphQL 错误查询在解析器中定义,但不在模式中