我正在实施Hutton的书中的 Programming in Haskell 中的算术表达式树例子,我收到了语法错误:
解析错误(可能是错误的缩进或括号不匹配)
firstgrm = do t <- secgrm
( do { symbol "##";
o <- firstgrm;
return (O (t ## o));}
+++ return t ) -- parse error here
答案 0 :(得分:10)
在省略花括号的情况下,Haskell使用off-side rule;块由它们的缩进表示。 Wikibook可以很好地描述Haskell缩进的工作原理:
所有分组表达式必须完全对齐。在第一行,Haskell将表达式左边的所有内容计为缩进,即使它不是空格。
在您的示例中,您有两个do
块。内部使用花括号,而外部使用花括号。您可以通过向外部do
块添加花括号来编译代码:
firstgrm = do { t <- secgrm;
( do { symbol "##";
o <- firstgrm;
return (O (t ## o));}
+++ return t ) }
......虽然我真的不推荐它。
习惯上总是省略大括号。缩进规则也使得do
块放在括号内变得尴尬,所以我们通常也会避免这种情况。
firstgrm = do t <- secgrm
x t +++ return t
where
x t = do symbol "##"
o <- firstgrm
return (O (t ## o))