すごいHaskell8章
アクションと型コンストラクタ
アクションと型コンストラクタの違いって何だろう。あと、どうやって区別するんだろう。
例えば getLine の型を見てみる。
ghci> :t getLine getLine :: IO String
これって、型コンストラクタ IO が、具体型 String を受け取った型に見える。
種類も型コンストラクタと同じだし。
ghci> :k IO IO :: * -> * ghci> :k Maybe Maybe :: * -> *
また後で解説が出てくるのかな。
(追記)出てきた。
I/O アクションが特別なのは、 main 関数の中に入っていると(あるいは GHCi のプロンプトで評価されると)、それが実行されるところです。
(174p)
sequence と map
sequence に map で print アクションのリストを渡す。
ghci> sequence $ map print [1,2,3,4,5] 1 2 3 4 5 [(),(),(),(),()]
これができるのに、
ghci> map print [1,2,3,4,5] <interactive>:8:1: No instance for (Show (IO ())) arising from a use of `print' Possible fix: add an instance declaration for (Show (IO ())) In a stmt of an interactive GHCi command: print it
このエラーは何?
→単に IO () 型は Show のインスタンスじゃないから ghci の print で表示できないってだけだった。
シーケンスは I/O アクション。
並んだ I/O アクションを順に実行するようなもの。
大事なのはリストじゃなくて、順に実行される「I/Oアクション」だということ。
だから sequecne 関数の返り値は
ghci> :t sequence sequence :: Monad m => [m a] -> m [a]
Monad が何かわからないけど、後で出てくるはず。(章があるし)
print を リストに map すると、 部分適用された IO () 型のリストになる
ghci> :t map print [1,2,3,4,5] map print [1,2,3,4,5] :: [IO ()]
mapM は sequece $ map ... を単に省略したものかな。