在哈斯克尔你可以说
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)
您的问题的规范答案可以在 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)