Haskell:`parse error in pattern`在哪里?

3

这是我拥有的代码:

connected :: [(Integer,Integer)] -> Bool
connected [] = True
connected [(_,_)] = True
connected (a,b):(c,d):xs
                 | a > c     = False
                 |otherwise = connected (c,d):xs

当我在GHCi中加载它时,它显示如下错误:

错误:模式匹配中的语法错误:connected

我犯了什么错误?

小的风格建议:在我的看法中,foo | x = False | otherwise = something 更常见的写法是 foo = not x && something。在你的情况下,你可以使用 connected (...) = a <= c && connected (...) - chi
1个回答

6

你需要在两个地方的cons表达式周围加上括号:

connected :: [(Integer,Integer)] -> Bool
connected [] = True
connected [(_,_)] = True
connected ((a,b):(c,d):xs)                           -- (2)
                 | a > c     = False
                 | otherwise = connected ((c,d):xs)  -- (1)
  1. 函数应用的优先级比中缀操作符更高,因此connected (c,d) : xs被解析为(connected (c,d)) : xs

  2. 在模式表达式中也会发生类似的情况。虽然你得到的错误信息不够友好,这很不幸。

个人看法附注:我建议始终在中缀操作符周围加上空格(例如a : b而不是a:b),因为省略空格微妙地暗示了操作符的优先级比实际的要高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接