@vvakame ありがちな罠に……。f xs = map (print) xs みたいなことをすると、fの型が [a] -> [IO ()] という感じになってしまうので注意が必要です。
2012-11-16 18:53:16@mzp [m a] と僕が持っているものの乖離について思いを馳せている次第であります!ありがとうねしばらくかかるよ。ぽくぽくちーん。
2012-11-16 18:58:42@vvakame 例えば、グローバル変数v::aを含む世界を考えると、〈(…v…), x〉 みたいなコンテナになります。vにアクセスするにはsetV::a->IO (), getV::IO aという関数を用意してやります。setVとgetVの実装はプログラムからは見えません
2012-11-16 18:58:46関数適用して IO () にする前にsequence_噛ませろって話しかと思ったら IO () にして[IO ()]になった後にsequence_適用しろという話しだったでござる。なるほど。
2012-11-16 19:02:43@vvakame [String]の中身を1行に一つずつ出力するような処理を書きたい場合は、 f::[String]->IO () f xs = mapM_ putStrLn xs という感じになります。
2012-11-16 19:04:33やっとRow String が扱えるようになったぽよー…。と思ったらなんか理解がズレている。何故だ。これ1行の1列かと思ったら1行だし。
2012-11-16 19:09:21@vvakame putStrLn::String->IO () なので、map putStrLn xs とすると[IO ()] が返ってきてしまいます。mapM_ f xsはf::a->IO ()をxsのそれぞれの要素に順に適用して、最後にIO ()を返します
2012-11-16 19:11:01@vvakame "sequence_ $ map dumpRow" のところは "mapM_ dumpRow" で置き換えられますね
2012-11-16 19:12:01@NaOHaq mapM_ :: Monad m => (a -> m b) -> [a] -> m () なので、IO () が返るわけですね。mapM_ ってIOモナド以外では使わないですか?
2012-11-16 19:14:26