在阻塞中的Haskell缩进

时间:2016-05-12 05:17:45

标签: haskell functional-programming

我正在实施Hutton的书中的 Programming in Haskell 中的算术表达式树例子,我收到了语法错误:

  

解析错误(可能是错误的缩进或括号不匹配)

firstgrm = do t <- secgrm
             ( do { symbol "##";
               o <- firstgrm;
           return (O (t ## o));}
        +++ return t )                         -- parse error here

1 个答案:

答案 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))