Hatena::Grouphaskell

(200) Days of Haskell - Ruby 厨だけどハスケルやるよ

2011-09-29

(4) map と MapM / mapM_

| 20:11

Prelude> map print ["hoge", "piyo", "fuga"]

<interactive>:1: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
Prelude> mapM_ print ["hoge", "piyo", "fuga"]
"hoge"
"piyo"
"fuga"
Prelude> :t mapM putStrLn ["hoge", "piyo", "fuga"]
mapM putStrLn ["hoge", "piyo", "fuga"] :: IO [()]
Prelude> :t map putStrLn ["hoge", "piyo", "fuga"]
map putStrLn ["hoge", "piyo", "fuga"] :: [IO ()]

[IO ()] だと、 Showインスタンスでなくて、 IO [()] ならいいよということなのだろうがょくゎかりません…。何が違うのか。

tsurushuutsurushuu2011/09/29 21:49ghciの表示は、ただ単に、「Showのインスタンスを表示する」わけでは無かったはずですよ。

参考
http://www.kotha.net/ghcguide_ja/7.0.4/interactive-evaluation.html

とくに、IO [()]は、そのものがIO aなので、ghciが、気を利かせて、IO動作として実行してくれるのですが、

[IO ()]の場合は、IO ではなく、あくまでも、「リスト」なので、この状態では、IO動作としての実行をしないのだと思います。
(かつ、Showのインスタンスでもないので、表示も出来ない)

udzuraudzura2011/09/30 11:06なるほど、たしかにprintやpurStrLnでは返ってきた型のほうは表示していませんね、、、
説明読みましたが、雰囲気は分かっても理解できているか怪しいです><