Conduitがバージョンアップのたびに早くなってるのはSnoymanさんがたまにベンチ載せてますけど、ライブラリ感では見た事無いですね RT @kazu_yamamoto どなたか、conduit は iteratee より遅い疑惑を追ってないでしょうか?
2012-06-29 13:56:59多分当初は、文字列処理は4kブロックとかのリストにすれば十分だよね的発送だと思ってたのだろうけど、やはりちょっと扱いづらいし、普通の数のリストも扱いたいとかで、だんだんオーバーヘッド減らす方向に。実装見た感じだとEnumerateeはConduitと同じぐらいかなあ。
2012-06-29 13:58:40.@tanakh IO の中で IOException を投げるには、throwIO じゃなくて、throwError を使うべきなんですか?
2012-06-29 14:01:47.@tanakh 純粋な関数で throwError と書くと、例外を投げているように見えて、ドキッとするんですが、どうなんでしょうか? 直接 Left とか書く方がよくありませんか? 型を Maybe に変えるみたいなときに便利なの?
2012-06-29 14:03:45@kazu_yamamoto 直接LeftよりはthrowErrorのほうがいいかなあと思います。Eitherを変換子版のErrorTに変えたくなった時とか、StateT s (ErrorT m) ... みたいなネストしているのを考えた時に便利です。
2012-06-29 14:06:20.@tanakh あ、すいません。タイポしました。Conduit は (iteratee ではなく) enumerator ぐらい速いのかという質問です。昔より Mighty が遅いので、その原因を追っています。
2012-06-29 14:06:46@kazu_yamamoto 僕は最初から型は決めないで、なるべくゆるい制約で(そういう場合だったら MonadError e m) で書いてしまいますね。
2012-06-29 14:07:15@kazu_yamamoto うーん、ちょっとConduitも実装の変化とともに速度が毎回変わるのでどうでしょうか。conduit-0.4でyield/await使ったときはすこぶる性能が悪かったですが、conduit-0.5で改善されてるはずなので、再調査が必要ですね
2012-06-29 14:08:47@kazu_yamamoto そうですね。MonadErrorの意味は、変換子によってリフトされたエラーも統一的に扱えるようにするためだったりしますので。
2012-06-29 14:10:21多分、例外というのがgotoでぶっ飛ぶ的なイメージがもう僕にはないので、裏で制御フローいじって例外的動作ができる、MaybeとかEitherとかも例外と見ても違和感がなくなってるのかなあ。
2012-06-29 14:11:42モナド変換子はなんとなくあんまりスジがいいとは思わないのだけども、みんなが頑張ってHackしたおかげで実際使えるものになってるので、使うといいんじゃあないかな。
2012-06-29 14:13:35素人が見れば、@tanakh くんの「純粋関数は全域関数であるべき」という主張と、一見矛盾しているように感じられます。(単に throwError という関数名が悪いんですけど。)
2012-06-29 14:13:39例外処理,名前からして通常の処理を続けられない時にどうするか,というだけしか表してないのだけど,C++とかJavaとかの影響で例外といえばなんかオブジェクトが飛んでくる,というイメージがついているのは確か.
2012-06-29 14:14:21@kazu_yamamoto まあ名前ですね。throwErrorの型は、error::String->aのようにbotしか取れないようなファンキーな型じゃないですし。抽象化された上での動作はまあ一般的な意味での`throw`しているかのように見えるので、ちゃんと理解していれば…
2012-06-29 14:17:05@kazu_yamamoto まあ名前ですね。throwErrorの型は、error::String->aのようにbotしか取れないようなファンキーな型じゃないですし。抽象化された上での動作はまあ一般的な意味での`throw`しているかのように見えるので、ちゃんと理解していれば…
2012-06-29 14:17:05Stateモナドがpurelyな文脈でmutableな変数を実現してるのと同じ構図かなあ。MonadErrorがtotalな文脈でbotを扱えるかのように見えるのは。
2012-06-29 14:18:06