Listのtraverseの実装がscalazより猫のほうが優れている件

1
がくぞ @gakuzzzz

scalaz.Traverse#traverse で F=List, G=Option の時に、途中でNoneを返す要素があっても全ての要素にfが適用されてしまう。 cats の Traverse だとNoneになる要素以降のfは評価されない。ぐぬぬ

2016-06-01 18:19:45
Kenji Yoshida @xuwei_k

@gakuzzzz お、pull reqくれるんですね(?)

2016-06-01 18:36:21
がくぞ @gakuzzzz

@xuwei_k scalaz.Need が cats.Eval に相当するものって認識であってます? 別もの?

2016-06-01 18:43:12
Kenji Yoshida @xuwei_k

@gakuzzzz Evalのほうがおそらく高機能

2016-06-01 18:43:45
がくぞ @gakuzzzz

@xuwei_k ふむむむ、差が存在するんですね。単純に Need 導入するだけじゃダメっぽい予感

2016-06-01 18:45:44
Kenji Yoshida @xuwei_k

@gakuzzzz あとこんな違いもあります(今試したらcatsは逆順じゃないっぽい) github.com/scalaz/scalaz/…

2016-06-01 18:47:49
がくぞ @gakuzzzz

@xuwei_k あ、そうそう、それも気になってました。close されてるんですね...

2016-06-01 18:49:47
Kenji Yoshida @xuwei_k

@gakuzzzz 実装全然ちがいますね・・・ github.com/scalaz/scalaz/… github.com/typelevel/cats… これしかもちゃんとstack溢れないのか・・・

2016-06-01 18:51:13
がくぞ @gakuzzzz

@xuwei_k そうなんですよね。 foldLeft は B 返すのに foldRight は Eval[B] 返すのがちょっと面白い。けどいいのかコレ?という気も

2016-06-01 18:54:02
がくぞ @gakuzzzz

Haskell の traverse は catsと同じ挙動っぽい

2016-06-01 18:58:36
Kenji Yoshida @xuwei_k

@gakuzzzz scalazのListのtraverse、この変更 github.com/scalaz/scalaz/… とかの影響で、List => DList => IList にしてfoldRight呼ぶ、みたいな超無駄なことしてる気がしてきました、つらい・・・

2016-06-01 19:05:05
がくぞ @gakuzzzz

@xuwei_k oh 内部では直接 List の連結してなかったんですね。

2016-06-01 19:09:12
がくぞ @gakuzzzz

foldRight に side-effect 仕込んでも left側から実行されるの黒魔術めいてスゴイ

2016-06-01 19:10:33
Kenji Yoshida @xuwei_k

@gakuzzzz 猫をパクったら github.com/xuwei-k/scalaz… 見事にNoneあったら評価止まるようになったけど、見事にスタック溢れるので、Eval素晴らしい(?)みたいな結論になりました・・・

2016-06-01 19:20:31
Kenji Yoshida @xuwei_k

@gakuzzzz (自分が言い出すのなんか気まずいので黙ってたけど)この例とか出して「scalazにcatsのEvalみたいなやつ入れようぜ!」って真面目にissue立ててくれていいですよ・・・ (もしくは他の方法でListのtraverse改善pull reqを)

2016-06-01 19:22:34
がくぞ @gakuzzzz

@xuwei_k うお Eval と Need の決定的な差が……

2016-06-01 19:24:38
Kenji Yoshida @xuwei_k

@gakuzzzz まぁ即興でやったので、移植間違ってないか、本当にNeedとEvalの差が原因なのか?というの、今一度確かめたほうがいい気はしますが

2016-06-01 19:25:56
がくぞ @gakuzzzz

世界のKenjiの威を借りてPull Requestするマン

2016-06-02 02:37:28
がくぞ @gakuzzzz

ぷるリクエストじゃなかったIssue立てただけだった

2016-06-02 02:37:53
Kenji Yoshida @xuwei_k

github.com/xuwei-k/scalaz… Needの代わりにTrampoline使えばいけるのでは、と思ってやってみたが敗北したので、ますます辛い

2016-06-02 10:13:13
がくぞ @gakuzzzz

@xuwei_k おお! Apply.ap2Eval を抽象化して盛り込むのクールですね

2016-06-03 21:31:25
Kenji Yoshida @xuwei_k

@gakuzzzz 一瞬、それぞれのインスタンスでoverrideしないといけないの面倒だなーと思ったけど、これ結局catsでもOptionのmap2Evalがoverrideされてないとあの動作になってない、ということなんですかね?(ちゃんと確かめてない)

2016-06-03 21:36:12
がくぞ @gakuzzzz

@xuwei_k cats も 短絡になるように override してるっぽい感じですね。 github.com/typelevel/cats…

2016-06-03 21:42:22