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"に追加