在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 }
答案 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
}