我在处理某些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`
答案 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.