该do
符号允许我们在没有大量嵌套的情况下表达一元代码,因此
main = getLine >>= \ a ->
getLine >>= \ b ->
putStrLn (a ++ b)
可以表示为
main = do
a <- getLine
b <- getLine
putStrLn (a ++ b)
但是,假设语法允许... #expression ...
代表do { x <- expression; return (... x ...) }
. 例如,foo = f a #(b 1) c
将被脱糖为:foo = do { x <- b 1; return (f a x c) }
. 那么,上面的代码可以表示为:
main = let a = #getLine in
let b = #getLine in
putStrLn (a ++ b)
这将被取消为:
main = do
x <- getLine
let a = x in
return (do
x' <- getLine
let b = x' in
return (putStrLn (a ++ b)))
那是等价的。这种语法对我很有吸引力,因为它似乎提供了与 do-notation 相同的功能,同时还允许一些较短的表达式,例如:
main = putStrLn (#(getLine) ++ #(getLine))
所以,我想知道这个提议的语法是否有任何缺陷,或者它是否确实完整并等同于 do-notation。