在没有布局的情况下使用符号的绑定需要“in”吗?

时间:2014-01-28 22:24:24

标签: haskell

在Haskell你可以说

main = do
  let x = 5
  print x

这不会编译:

main = do
  let x = 5
  in print x

但如果我使用显式布局,则无法编译:

main = do {
  let x = 5;
  print x;
  }

但这有效:

main = do {
  let x = 5
  in print x;
  }

我是对的吗?有没有什么地方我可以阅读更多关于显式布局和做和让符号?在我看来Section 3.14 of the Haskell 98 report建议我的第三个例子应该有效,因为它说我可以写

do { let DECLS; stmts }

并转换为

let DECLS in do { stmts }

1 个答案:

答案 0 :(得分:2)

您的问题的规范性答案可以在Haskell报告中对layout rule的描述中找到。

简而言之,您需要在let块和do块的下一个语句之间放置一个分号。那个分号需要位于let块之外。如果使用let块的布局,那很简单,只需说:

  let {x = 5};

但是,如果你使用let块的布局,那么关闭let块的唯一方法是在x列之前的列中开始一行。所以这意味着你必须写下这样的东西:

main = do {
  let x = 5
  ; print x;
}

哦,对于你的另一个例子,再次使用布局在in之前插入一个分号,所以你的代码去了:

main = do {
  let {x = 5
  };
  in print x
}