do記法よりも明示的に(>>=)を使う(2)

do記法よりも明示的に(>>=)を使った方が綺麗で分かりやすい場合がある。

  • do記法
import System.IO     
    
main = do     
    todoItem <- getLine  
    appendFile "todo.txt" (todoItem ++ "\n")  
  • 1行入力して次のブロックへ渡し、それに改行を付けて次へ、そして、"todo.txt"に追加というイメージがそのまま表現されている。
import System.IO     

main = getLine >>= \str -> return (str ++ "\n") >>= appendFile "todo.txt"
  • (++)関数の引数の順序を入れ替えると " \str -> " を消せる。よけい見づらいか・・・。
import System.IO     

main = getLine >>=  return.(flip (++) "\n") >>= appendFile "todo.txt"
  • fmap を使う:getLine の返す IO 型の値に fmap を使って "\n" を追加する関数を適用する。
import System.IO     

main = fmap (flip (++) "\n") getLine >>= appendFile "todo.txt"
  • fmap の引数の順序を逆に。
import System.IO     

main = getLine `fmap2` (\x-> x ++ "\n")  >>= appendFile "todo.txt"

fmap2 = flip fmap
  • fmap と <$> は同等。
import System.IO  
import Control.Applicative

-- 1.IO 型の getLine の結果である文字列に対して、
--   (++) 関数を引数を逆にして摘要する。
-- 2.それは appendFile の二番目の引数。

main = appendFile "todo.txt" =<< (flip (++) "\n") <$>  getLine
  • 前置記法
import System.IO     

main = (>>=) ((>>=) getLine                   -- getLine の結果を1番目の引数とする。
                   (return.(flip (++) "\n")) -- 1番目の引数で受け取った値に関数を適用して返す
             (appendFile "todo.txt")          -- 最初の関数 ((>>=) の結果を引数として、
                                              -- ファイル"todo.txt"に追加