#scalaz 7 の enumIterator

0
Kenji Yoshida @xuwei_k

scalaz 7 の example って古いやつもちゃんと動くのかなぁーコンパイル通るかどうかしかチェックしてないよなー => とりあえず全部のmainを順番に全部に走らせられるようにsbtファイル修正 => 予想通りassertが引っかかるexampleがみつかる(イマココ

2012-11-29 13:42:04
Kenji Yoshida @xuwei_k

https://t.co/BarkNW7f exampleのproject内でやろうとしたらdiscoveredMainClassesとsourceGeneratorsが循環参照してできなかったので、わざわざ別プロジェクトつくったけど、誰かこれをもっと短く綺麗にしてくれませんかね

2012-11-29 13:45:31
Kenji Yoshida @xuwei_k

https://t.co/TkP20INs 自分で原因探ってみるつもりだけど、すぐには解決しなそうなので issue 登録 #scalaz

2012-11-29 13:57:23
Kenji Yoshida @xuwei_k

git bisect して原因探ろうとしたら、途中でscalazのsbtのbuildファイル自体がコンパイル通らない自体に遭遇して萎えた(´・ω・`)ェ・・・ https://t.co/qbYva1Ws

2012-11-29 14:02:25
Kenji Yoshida @xuwei_k

https://t.co/ZmK2tv6H Iterateeのheadとpeekって型まったく同じっぽいけど何が違うんだろう、exampleでも同じ結果期待してるし。そもそもさっきのバグ探るためにIteratee読んでるけど、未だにあまりIterateeわかってないな・・・

2012-11-29 14:51:36
Keigo Imai @keigoi

@xuwei_k よくしらないのであれですが副作用の有無じゃないっすかね。

2012-11-29 14:55:29
慎ましく暮らす人 @qtamaki

@xuwei_k scalazは知らんけど、一般的には、headは、取り出しでpeekは、「ちょっと覗いて戻す」だった気がす。C++のSTLとか。

2012-11-29 14:56:56
ぽけば @pocketberserker

@xuwei_k headはデータを消費してpeekは消費しない、だったと思います

2012-11-29 14:57:22
ぽけば @pocketberserker

言葉足らずかもしれない、とリプしてから思ってしまった…

2012-11-29 14:57:52
ぽけば @pocketberserker

たとえばList(1,2)を対象にIteratee.headするとChunkとして残るのはList(2)だけど、peekの場合はList(1,2)のままとかそんな感じだったような

2012-11-29 15:01:19
ぽけば @pocketberserker

同じIterateeでも実装方針でわりと細部が異なるのだなぁやっぱり

2012-11-29 15:21:48
Kenji Yoshida @xuwei_k

本体のbugなのか、exampleが悪いのかっていうところからわからない(´・ω・`) https://t.co/1ukZtUcK ここをdefにすれば通るけど。 scalaz.iteratee.EnumeratorT がそもそもimmutableなのかどうかっていうところが

2012-11-29 15:38:55
ぽけば @pocketberserker

headで1が取り出されて残りの入力がIterator(2,3)。この状態でlengthすると2が結果になり、続いてpeekすると2が結果になる。うーん、正しい気がする。ので、exampleの期待値がミスしてるんじゃないかなぁ。コードで確認とってないのでアレだけど。

2012-11-29 15:57:13
ぽけば @pocketberserker

もしくはpeek -> length -> headの順で書こうとしていたが間違えた?

2012-11-29 15:58:46
Kenji Yoshida @xuwei_k

.@pocketberserker でもそう考えると、今度は上の https://t.co/1CWYl6oU enumStreamの部分がおかしいことになってしまうような?

2012-11-29 16:02:23
Kenji Yoshida @xuwei_k

enumStreamもenumIteratorも返ってくる型は同じ→でもenumIteratorで作成したEnumeratorTのほうだけmutableであるかのような挙動をしている→mutableかどうかは型で判断できないの?やっぱりenumIterator自体がバグってる?

2012-11-29 16:06:50
ぽけば @pocketberserker

enumIteratorの仕様がわからない…mutableな動きしてるしlengthしたらデータ全消費してしまうし、なんじゃこりゃ

2012-11-29 18:04:20
Kenji Yoshida @xuwei_k

@pocketberserker length呼んだらデータ消費するのはscala自体のIteratorの仕様なので、length呼んでもデータ消費せず繰り返し利用できるようにするには、内部的に一度Listなどに変換して保持しておく必要があると思うんですけどそれをやってないので…

2012-11-29 18:11:24
ぽけば @pocketberserker

@xuwei_k なるほどです。mutableなデータに対してIterateeって使ったことがないので、仕様を把握するのが難しいですね…。

2012-11-29 18:22:22
ねこはる @halcat0x15a

enumIterator、peekでも要素消費してそうな名前ですね。

2012-11-29 18:25:16
がくぞ @gakuzzzz

mutable な Iteratee ってたしかに ? ってなる。

2012-11-29 18:40:54
Kenji Yoshida @xuwei_k

mutableに振る舞うのがだめなら enumIterator のメソッドが今の実装方針じゃ全面的にだめで、そもそもenumIteratorが存在するべきではないか、もしくはすぐにiteratorをtoStreamしてそれをenumStreamに渡すとかそういうことですかね?

2012-11-29 18:44:02