Conduitの話と例外処理の話 20120629

Conduitの話と例外処理の話 20120629
0
山本和彦 @kazu_yamamoto

Hackage の wai は conduit 0.5 に対応していないのか。。。テストできなくて残念。

2012-06-29 13:55:08
山本和彦 @kazu_yamamoto

どなたか、conduit は iteratee より遅い疑惑を追ってないでしょうか?

2012-06-29 13:56:10
Hideyuki Tanaka @tanakh

Conduitがバージョンアップのたびに早くなってるのはSnoymanさんがたまにベンチ載せてますけど、ライブラリ感では見た事無いですね RT @kazu_yamamoto どなたか、conduit は iteratee より遅い疑惑を追ってないでしょうか?

2012-06-29 13:56:59
Hideyuki Tanaka @tanakh

多分当初は、文字列処理は4kブロックとかのリストにすれば十分だよね的発送だと思ってたのだろうけど、やはりちょっと扱いづらいし、普通の数のリストも扱いたいとかで、だんだんオーバーヘッド減らす方向に。実装見た感じだとEnumerateeはConduitと同じぐらいかなあ。

2012-06-29 13:58:40
Hideyuki Tanaka @tanakh

Iterateeは多分Enumerateeより速いと思うんだけど今更使う気がしない。pipesとかは要調査。

2012-06-29 13:59:02
山本和彦 @kazu_yamamoto

.@tanakh IO の中で IOException を投げるには、throwIO じゃなくて、throwError を使うべきなんですか?

2012-06-29 14:01:47
山本和彦 @kazu_yamamoto

.@tanakh 純粋な関数で throwError と書くと、例外を投げているように見えて、ドキッとするんですが、どうなんでしょうか? 直接 Left とか書く方がよくありませんか? 型を Maybe に変えるみたいなときに便利なの?

2012-06-29 14:03:45
Hideyuki Tanaka @tanakh

@kazu_yamamoto IOの中ならどっちでもいいと思います。

2012-06-29 14:04:18
山本和彦 @kazu_yamamoto

抽象化するなら、その具体的なメリットが知りたいなぁ。← いつも Monad の説明でおろそかにされる重要な点

2012-06-29 14:04:55
Hideyuki Tanaka @tanakh

@kazu_yamamoto 直接LeftよりはthrowErrorのほうがいいかなあと思います。Eitherを変換子版のErrorTに変えたくなった時とか、StateT s (ErrorT m) ... みたいなネストしているのを考えた時に便利です。

2012-06-29 14:06:20
山本和彦 @kazu_yamamoto

.@tanakh あ、すいません。タイポしました。Conduit は (iteratee ではなく) enumerator ぐらい速いのかという質問です。昔より Mighty が遅いので、その原因を追っています。

2012-06-29 14:06:46
Hideyuki Tanaka @tanakh

@kazu_yamamoto 僕は最初から型は決めないで、なるべくゆるい制約で(そういう場合だったら MonadError e m) で書いてしまいますね。

2012-06-29 14:07:15
山本和彦 @kazu_yamamoto

.@tanakh 分かりました。僕にメリットが感じられないのは、Monad 変換子をあまり使わないからですね。

2012-06-29 14:07:58
Hideyuki Tanaka @tanakh

@kazu_yamamoto うーん、ちょっとConduitも実装の変化とともに速度が毎回変わるのでどうでしょうか。conduit-0.4でyield/await使ったときはすこぶる性能が悪かったですが、conduit-0.5で改善されてるはずなので、再調査が必要ですね

2012-06-29 14:08:47
山本和彦 @kazu_yamamoto

なるほど。@tanakh くんの型レベルでの設計は、その域まで達しているのですか。

2012-06-29 14:08:47
Hideyuki Tanaka @tanakh

@kazu_yamamoto そうですね。MonadErrorの意味は、変換子によってリフトされたエラーも統一的に扱えるようにするためだったりしますので。

2012-06-29 14:10:21
Hideyuki Tanaka @tanakh

多分、例外というのがgotoでぶっ飛ぶ的なイメージがもう僕にはないので、裏で制御フローいじって例外的動作ができる、MaybeとかEitherとかも例外と見ても違和感がなくなってるのかなあ。

2012-06-29 14:11:42
Hideyuki Tanaka @tanakh

モナド変換子はなんとなくあんまりスジがいいとは思わないのだけども、みんなが頑張ってHackしたおかげで実際使えるものになってるので、使うといいんじゃあないかな。

2012-06-29 14:13:35
山本和彦 @kazu_yamamoto

素人が見れば、@tanakh くんの「純粋関数は全域関数であるべき」という主張と、一見矛盾しているように感じられます。(単に throwError という関数名が悪いんですけど。)

2012-06-29 14:13:39
SKS rep @repeatedly

例外処理,名前からして通常の処理を続けられない時にどうするか,というだけしか表してないのだけど,C++とかJavaとかの影響で例外といえばなんかオブジェクトが飛んでくる,というイメージがついているのは確か.

2012-06-29 14:14:21
Hideyuki Tanaka @tanakh

プログラムにおける例外処理と、"the exception" の乖離かな。

2012-06-29 14:14:56
Hideyuki Tanaka @tanakh

@kazu_yamamoto まあ名前ですね。throwErrorの型は、error::String->aのようにbotしか取れないようなファンキーな型じゃないですし。抽象化された上での動作はまあ一般的な意味での`throw`しているかのように見えるので、ちゃんと理解していれば…

2012-06-29 14:17:05
Hideyuki Tanaka @tanakh

@kazu_yamamoto まあ名前ですね。throwErrorの型は、error::String->aのようにbotしか取れないようなファンキーな型じゃないですし。抽象化された上での動作はまあ一般的な意味での`throw`しているかのように見えるので、ちゃんと理解していれば…

2012-06-29 14:17:05
Hideyuki Tanaka @tanakh

Stateモナドがpurelyな文脈でmutableな変数を実現してるのと同じ構図かなあ。MonadErrorがtotalな文脈でbotを扱えるかのように見えるのは。

2012-06-29 14:18:06