我是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)。
我尝试了什么:
答案 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