使用WinGHCi在“|”符号上解析Haskell错误

时间:2017-05-23 00:04:20

标签: haskell

我是Haskell的新手并且得到了这个臭名昭着的错误。

我已经查阅了这些链接: Haskell: parse error on input `|' Haskell parse error on input '|' Haskell - parse error on input `|' Why complains Haskell parse error on input `|' in this Function? Haskell parse error on input `|'

让我感到惊讶的是,我复制了完全我大学老师在课堂上给我们的代码:

-L/opt/X11/lib -lX11

我知道问题出在foo arg下面,因为以下代码编译:

data TreeInt = Leaf Int
             | Node TreeInt Int TreeInt
foo :: TreeInt -> Int
foo arg =
 case arg of
  | Leaf x = x
  | Node tLeft x tRight = x

确切的错误是:data TreeInt = Leaf Int | Node TreeInt Int TreeInt foo :: TreeInt -> Int foo arg = undefined 这让我相信它是在第6行(| Leaf)。

我尝试了什么:

  • 使用模式匹配转换代码(得到另一个错误)
  • 将案例与foo arg
  • 放在同一行
  • 添加更多/更少的空格
  • 添加“let”,因为某些版本的GHC在没有它的情况下会出现问题(没有变化)

1 个答案:

答案 0 :(得分:5)

而不是这个(#1):

case arg of
  | Leaf x = x
  | Node tLeft x tRight = x

你想要这个(#2):

case arg of
  Leaf x -> x
  Node tLeft x tRight -> x

#1的样式用于其他ML系列语言,例如OCaml:

match arg with
  | Leaf x -> x
  | Node (tLeft, x, tRight) -> x

但是Haskell使用“布局规则”将#2变为以下内容:

case arg of {
  Leaf x -> x;
  Node tLeft x tRight -> x;
}

(事实上,如果你愿意,你可以明确地写出来。)

另请注意,->使用case个表达式,=使用定义:

foo arg =
  case arg of
    Leaf x -> x
    Node tLeft x tRight -> x

foo' (Leaf x) = x
foo' (Node tLeft x tRight) = x

即使模式上有一个保护表达式,这也是正确的 - 这是垂直条(|)实际用于:

foo arg =
  case arg of
    Leaf x
      | x < 0 -> 0
      | otherwise -> x
    Node tLeft x tRight
      | x < 0 -> 0
      | otherwise -> x

foo' (Leaf x)
  | x < 0 = 0
  | otherwise = x
foo' (Node tLeft x tRight)
  | x < 0 = 0
  | otherwise = x