haskell中的do

在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,编译器就把这一段连续执行的代码认为是一个命令了。

原文地址:https://www.cnblogs.com/sickboy/p/3322460.html