Haskell:"模式中的解析错误"在哪里

Jac*_*ck 3 haskell pattern-matching operator-precedence parse-error

这是我的代码:

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

当我加载它GHCi它显示

error: parse error in pattern: connected

我在哪里弄错了?

Chr*_*tin 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)
Run Code Online (Sandbox Code Playgroud)
  1. 函数应用程序比中缀运算符绑定得更紧密,因此connected (c,d) : xs被解析为(connected (c,d)) : xs.

  2. 类似的事情发生在模式表达式中.虽然你得到的无用的错误信息是相当不幸的.

有意见的旁注:我建议总是在中间操作符周围写入空格(例如,a : b代替a:b),因为我认为省略空白会巧妙地暗示操作符绑定比实际更紧密.