如何摆脱Haskell中的“模式解析错误”错误

时间:2018-08-06 05:36:28

标签: haskell

我在处理某些haskell代码时遇到了麻烦。即功能校验和 这是为了检查整数列表的总和是否等于整数tot。

语法有问题,因为我不断得到:

Main.hs:11:1: Parse error in pattern: checksum

模块未加载。

checksum :: ([Int], Int) -> (Bool, Int)

checksum [x] tot
    | x == tot        = (True, tot)
    | otherwise       = (False, tot)

checksum x:xs tot = checksum xs tot-x`

2 个答案:

答案 0 :(得分:2)

在Haskell中,函数应用程序具有比其他任何操作更高的关联强度。

因此,模式checksum x:xs tot被解析为(checksum x):(xs tot),这对于模式没有任何意义,并且会导致解析错误。具体来说,模式不允许使用(checksum x)之类的函数应用程序,除非在顶层定义函数。

正如评论所说,您应该将其括在checksum (x:xs) tot中,以便它可以按您期望的方式进行解析,并在顶层定义checksum

答案 1 :(得分:1)

好,为此进行了许多更正。我假设您的类型注释正确。

checksum :: ([Int], Int) -> (Bool, Int)

checksum ([x], tot) -- make argument a single tuple
    | x == tot        = (True, tot)
    | otherwise       = (False, tot)

checksum ((x:xs), tot) = checksum (xs, tot-x) -- group list; make argument and result a tuple.
-- removed extraneous back-tick at the end of the last line.