すごい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 ... を単に省略したものかな。