わかめモナ化のLTのネタ作り

とりあえずHaskellのプログラム書いてTypeScriptに移植してみるかーと思ったら全然そんなレベルじゃなかった。
0
NaOHaq(苛性ソーダ) @NaOHaq

@vvakame ありがちな罠に……。f xs = map (print) xs みたいなことをすると、fの型が [a] -> [IO ()] という感じになってしまうので注意が必要です。

2012-11-16 18:53:16
よんた @keita44_f4

@vvakame mapじゃなくてapp的なのないん?

2012-11-16 18:53:51
わかめ@毎日猫がいる @vvakame

@keita44_f4 Haskell全然わからんけどfoldMとかそういうやつ?調べてみよう…。

2012-11-16 18:54:51
mzp @mzp

@vvakame sequence_ :: Monad m => [m a] -> m () じゃないかな?

2012-11-16 18:55:48
わかめ@毎日猫がいる @vvakame

みずぴーさんが有益そうなこといってるけど理解に10分くらいかかりそう

2012-11-16 18:57:19
mzp @mzp

@vvakame わかめさんのほしい関数はsequence_ という関数だと思った次第であります!!

2012-11-16 18:58:04
よんた @keita44_f4

@vvakame foldあればなんでもできるね!

2012-11-16 18:58:42
わかめ@毎日猫がいる @vvakame

@mzp [m a] と僕が持っているものの乖離について思いを馳せている次第であります!ありがとうねしばらくかかるよ。ぽくぽくちーん。

2012-11-16 18:58:42
NaOHaq(苛性ソーダ) @NaOHaq

@vvakame 例えば、グローバル変数v::aを含む世界を考えると、〈(…v…), x〉 みたいなコンテナになります。vにアクセスするにはsetV::a->IO (), getV::IO aという関数を用意してやります。setVとgetVの実装はプログラムからは見えません

2012-11-16 18:58:46
mzp @mzp

@vvakame mとaは型変数なので、それぞれIOと()に置き換えればいいと思いました

2012-11-16 18:59:30
わかめ@毎日猫がいる @vvakame

@NaOHaq あ、なんか分かりやすいです!!

2012-11-16 18:59:31
わかめ@毎日猫がいる @vvakame

@mzp すごい!!コンパイル通った!!!

2012-11-16 19:01:23
わかめ@毎日猫がいる @vvakame

みずぴーさんすごい賢い感感じる。わかめの75倍くらい。

2012-11-16 19:01:44
わかめ@毎日猫がいる @vvakame

関数適用して IO () にする前にsequence_噛ませろって話しかと思ったら IO () にして[IO ()]になった後にsequence_適用しろという話しだったでござる。なるほど。

2012-11-16 19:02:43
NaOHaq(苛性ソーダ) @NaOHaq

@vvakame [String]の中身を1行に一つずつ出力するような処理を書きたい場合は、 f::[String]->IO () f xs = mapM_ putStrLn xs という感じになります。

2012-11-16 19:04:33
わかめ@毎日猫がいる @vvakame

@NaOHaq これは putStrLn がモナディックな関数?なので?mapM_ 使いましたということですよね。

2012-11-16 19:05:43
わかめ@毎日猫がいる @vvakame

やっとRow String が扱えるようになったぽよー…。と思ったらなんか理解がズレている。何故だ。これ1行の1列かと思ったら1行だし。

2012-11-16 19:09:21
NaOHaq(苛性ソーダ) @NaOHaq

@vvakame putStrLn::String->IO () なので、map putStrLn xs とすると[IO ()] が返ってきてしまいます。mapM_ f xsはf::a->IO ()をxsのそれぞれの要素に順に適用して、最後にIO ()を返します

2012-11-16 19:11:01
NaOHaq(苛性ソーダ) @NaOHaq

@vvakame "sequence_ $ map dumpRow" のところは "mapM_ dumpRow" で置き換えられますね

2012-11-16 19:12:01
わかめ@毎日猫がいる @vvakame

@NaOHaq mapM_ :: Monad m => (a -> m b) -> [a] -> m () なので、IO () が返るわけですね。mapM_ ってIOモナド以外では使わないですか?

2012-11-16 19:14:26
わかめ@毎日猫がいる @vvakame

[Row String] は理解できるけど、 [[Row String]] は理解できん…。1枚多くないかね?

2012-11-16 19:18:25
わかめ@毎日猫がいる @vvakame

IO がなるべく登場しないように頑張ってHaskellのプログラム書くと、printfデバッグできないのでは??

2012-11-16 19:19:07