conduit 0.3 そして 0.4 へ

4
山本和彦 @kazu_yamamoto

.@tanakh やはり、釈明したじゃないですか! :-)

2012-03-27 09:42:45
Hideyuki Tanaka @tanakh

BufferedSourceもなくなったかー

2012-03-27 09:26:48
Hideyuki Tanaka @tanakh

Conduit、バージョンが上がるたびにいろんなところがgreatly simplified されるけど、最初のは何だったんだ…

2012-03-27 09:32:13
Hideyuki Tanaka @tanakh

Pipesに欠落していたもの:「リソース管理はpipesと直交する。ResourceTを使えばよろしい」← これは違う。ResourceTは最終的にリソースが解放されることを保証するに過ぎず、なるべく早く解放する手段はない

2012-03-27 09:38:19
Hideyuki Tanaka @tanakh

制御フローのサポートが甘い:enumerator使ってた時辛かった点。データストリームにアクセスするIterateeモナドのコードが生きてるようにしないといけない(ちょっと意味分からん)conduitはBufferedSourceの概念でこれを解決してた

2012-03-27 09:43:00
山本和彦 @kazu_yamamoto

.@tanakh 単に Header パーサの食べ残し(ボディ)が捨てられちゃうから、アプリがボディを食べられないと言う意味でしょう。

2012-03-27 09:46:19
山本和彦 @kazu_yamamoto

"$$&" は、食べ残した src も返す。

2012-03-27 09:47:12
Hideyuki Tanaka @tanakh

遅延I/Oはやっぱりサポートしたい

2012-03-27 09:43:31
Hideyuki Tanaka @tanakh

Redditでの(conduitサイドの)議論:「Pipesの定義は一見正しそうだけど、実際のコードを見るまで正しく動くか信じられない」「conduitのキモ、BufferedSourceが完全に無視られてる」「エレガントさってのは極めて主観的で、無意味なコンセプト」

2012-03-27 09:49:07
Hideyuki Tanaka @tanakh

要するに、pipesは興味深いアイデアだけど、採用するに早すぎる。研究が必要だ。今日バスに6時間乗らなければいけないので、その研究に時間をさこうじゃないか。ってわけで、Pipesを実装してみた。得られた知見は次の通り。

2012-03-27 09:53:20
Hideyuki Tanaka @tanakh

・確かに統一された型でconduitを再実装することはできたようだ。そしてリソースセマンティクスも正しく動作しているように見える・Pipeをconnect/fuseする関数も正しく定義できるようだ・一番重要だけど、これで実装はすごいシンプルになった。

2012-03-27 10:00:46
山本和彦 @kazu_yamamoto

リソース管理を圏論で証明した? Haskell コミュニティは恐ろしすぎるな。。。

2012-03-27 10:01:32
Hideyuki Tanaka @tanakh

ところで、BufferedSourceはどうなったのか?違うアプローチ取ることにした。(BufferdSourceの説明は略)。connect&redume演算子、$$&を導入。これはSourceとSinkを接続して、その結果と、最終状態を返す演算子。これでよかったんや!

2012-03-27 10:08:38
Hideyuki Tanaka @tanakh

Iterateeとかでは、enumerator $$ iteratee は iterateeになるから、このへんの問題は発生しなかったように思うのだけどどうなのか?これがnon-standard制御フローのサポート?たしかに、途中でsinkの結果を取得できるのは便利だけど

2012-03-27 10:10:11
Hideyuki Tanaka @tanakh

かくして、SourceとSinkはなくなり、さらにBufferedSourceもなくなり、これが正しく動作している。これは良かったのか?未だ一つ問題が残っている。これは本当により良い解法なのか?人々は、ただひとつの型を目にする。そしてそれで分かった気になる。

2012-03-27 10:12:55
Hideyuki Tanaka @tanakh

で、SinkでVoidを使う必要があることに困惑する。あるいは、SourceとConduitがいまやモナドになったことによって、その結果は出力型ではなくて、(なんかよくわからない)結果の型になった。

2012-03-27 10:14:01
Hideyuki Tanaka @tanakh

でまあ、要するに、彼(Snoymanさん)は意見が欲しい。Conduit-0.4は良いとは思うけど、分離された型はそれはそれで違った良さがあった。Source/Sink/Conduitをnewtypeにするのも一つの手だし。これで意味のあるインスタンスだけに絞れるし、エラーメッセ

2012-03-27 10:16:48
Hideyuki Tanaka @tanakh

私見を書いておくと、僕はSourceとConduitがモナドになるととても嬉しいです

2012-03-27 10:17:29
Hideyuki Tanaka @tanakh

むしろ、unified typeとかどうでもいいから、SourceとConduitをモナドにして欲しかった

2012-03-27 10:17:50
山本和彦 @kazu_yamamoto

.@tanakh enumerator でソースを引き回せないことが、Conduit を作った動機です。HTTP proxy が作れなかったのです。(enumerator を入れ子にすればできるらしいけど、WAI がそれさえ禁止していた。)

2012-03-27 10:18:41
Hideyuki Tanaka @tanakh

@kazu_yamamoto なるほど。enumeratorではsource $$ sink がsinkになるので出来るんじゃないかと思っていたんですが、waiがそういうことを禁止していましたか。

2012-03-27 10:19:31
Hideyuki Tanaka @tanakh

まあとりあえずBufferedSourceはいまいちかっこよくないなあと思ってたので、$$&演算子のほうがいささかクールなのではないでしょうか。

2012-03-27 10:20:17
山本和彦 @kazu_yamamoto

.@tanakh ソースを引数として渡せることが、conduit の本質です。$$& も、それを実現する方法。

2012-03-27 10:20:49