在haskell中,有一个do的语句专门用来做一些不那么“干净”的事情,比如读写都需要用do来开头
一开始以为do的作用是做monad,后来发现是错误的,其实do做的事情是包裹一个顺序操作
比如在如下代码中
main=do if 2>1 then do putStrLn "Step 1" putStrLn "Step 2" else putStrLn "Step 3"
第三行中的do如果缺少的话,编译器会报这个错误
The function `putStrLn' is applied to three arguments, but its type `String -> IO ()' has only one In the expression: putStrLn "Step 1" putStrLn "Step 2" In a stmt of a 'do' block: if 2 > 1 then putStrLn "Step 1" putStrLn "Step 2" else putStrLn "Step 3" In the expression: do { if 2 > 1 then putStrLn "Step 1" putStrLn "Step 2" else putStrLn "Step 3" }
意思就是,第一个putStrLn被传了3个参数,“Step 1", putStrLn 和"Step 2"。没有写do,编译器就把这一段连续执行的代码认为是一个命令了。