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

Oma*_*man 8 haskell

在哈斯克尔你可以说

main = do
  let x = 5
  print x
Run Code Online (Sandbox Code Playgroud)

这将无法编译:

main = do
  let x = 5
  in print x
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用显式布局,则不会编译:

main = do {
  let x = 5;
  print x;
  }
Run Code Online (Sandbox Code Playgroud)

但这有效:

main = do {
  let x = 5
  in print x;
  }
Run Code Online (Sandbox Code Playgroud)

我对吗?有没有什么地方我可以阅读更多关于显式布局和做和让符号? Haskell 98报告的第3.14节似乎在我看来我的第三个例子应该有用,因为它说我可以写

do { let DECLS; stmts }
Run Code Online (Sandbox Code Playgroud)

它转化为

let DECLS in do { stmts }
Run Code Online (Sandbox Code Playgroud)

use*_*445 2

您的问题的规范答案可以在 Haskell 报告的布局规则描述中找到。

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

  let {x = 5};
Run Code Online (Sandbox Code Playgroud)

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

main = do {
  let x = 5
  ; print x;
}
Run Code Online (Sandbox Code Playgroud)

哦,对于您的另一个示例,再次使用布局,在 之前插入分号in,因此您的代码脱糖为:

main = do {
  let {x = 5
  };
  in print x
}
Run Code Online (Sandbox Code Playgroud)