在下面的代码第4行中,有一个表达式夹在do块中的两个IO操作之间:
1 doubleX :: (Show x, Num x) => x -> IO ()
2 doubleX x = do
3 putStrLn ("I will now double " ++ (show x))
4 let double = x * 2
5 putStrLn ("The result is " ++ (show double))我理解do表示法是使用>>=或>>将一元操作链接在一起。但是,当你在中间有一个表达式时,它是如何工作的呢?您不能仅仅使用>>将3-5行粘合在一起。
发布于 2017-07-30 20:06:51
我将从我非常相似的答案这里 (虽然可能不是一个重复的问题,因为这个问题没有明确地处理let)。
报告提供了从do语法到内核Haskell的完整翻译;与您的问题相关的部分如下:
do {e} =e do {e;stmts} =e >> } do {stmts} do {let decls;stmts} = let decls in do {stmts}
所以你的代码像这样:
doubleX x = do
putStrLn ("I will now double " ++ (show x))
let double = x * 2
putStrLn ("The result is " ++ (show double))
==> do {e;stmts} rule
doubleX x =
putStrLn ("I will now double " ++ (show x)) >> do
let double = x * 2
putStrLn ("The result is " ++ (show double))
==> do {let decls; stmts} rule
doubleX x =
putStrLn ("I will now double " ++ (show x)) >>
let double = x * 2 in do
putStrLn ("The result is " ++ (show double))
==> do {e} rule
doubleX x =
putStrLn ("I will now double " ++ (show x)) >>
let double = x * 2 in
putStrLn ("The result is " ++ (show double))https://stackoverflow.com/questions/45404126
复制相似问题