編集可能
2015年3月27日

scalaz.ListTが間違ってる(必ずしもMonadではない)件

4
ふみ a.k.a.DJ Monad @fumieval

github.com/scalaz/scalaz/… ScalazのListT、transformersのやつをそのまま移植してしまったのか…

2015-03-27 12:26:17
ふみ a.k.a.DJ Monad @fumieval

@xuwei_k はい。transformersのListTはモナドではなく、本来はこの世界から抹消されるべき存在と言っても過言ではないでしょう。

2015-03-27 12:37:30
Kenji Yoshida @xuwei_k

@fumieval 色々わかってないんですけど、ここにある wiki.haskell.org/ListT_done_rig… "newtype ListT m a = ListT { runListT :: m (Maybe (a, ListT m a)) }" という形にすればいいんですかね?

2015-03-27 12:52:32
Kenji Yoshida @xuwei_k

これ twitter.com/fumieval/statu… このときにテスト通らなくて結論もあまりでないままcloseした件 github.com/scalaz/scalaz/… と関係あるのかな

2015-03-27 13:03:59
ふみ a.k.a.DJ Monad @fumieval

@xuwei_k そうですね…理にかなった実装の一つだと思います。

2015-03-27 13:05:25
Kenji Yoshida @xuwei_k

@fumieval なるほど。"実装の一つ" というのは、同型で複数の実装がありえる(チャーチエンコーディングとかすれば?) という話ですか?

2015-03-27 13:07:39
Kenji Yoshida @xuwei_k

@fumieval あとさっきのページだと、IOと組み合わせた場合の例がでてたり "unnecessary strictness"と言ってるので、遅延評価が関係してくる(つまりScalaだと事情が異なる場合ある?)けど、遅延評価関係なくてもあの実装じゃダメ、ということなんですかね

2015-03-27 13:10:12
ふみ a.k.a.DJ Monad @fumieval

@xuwei_k 必ずしもそうではない場合もあります。たとえばpipes(hackage.haskell.org/package/pipes-…)で定義されているListTは微妙に異なりますが、これも正しい実装になります。

2015-03-27 13:12:16
ふみ a.k.a.DJ Monad @fumieval

@xuwei_k 確かに評価の問題もありますが、評価順序関係なしにListTはモナド変換子ではないのでそこが最も深刻な問題です。

2015-03-27 13:15:31
Kenji Yoshida @xuwei_k

github.com/scalaz/scalaz/… そういえば、StreamTのほうは、これ twitter.com/xuwei_k/status… と同型? で、たぶん正しさがある

2015-03-27 13:15:47
Kenji Yoshida @xuwei_k

@fumieval なるほど、ありがとうございます。あとで、既存のもの変更(修正)するか、別の "newtype ListT m a = ListT { runListT :: m (Maybe (a, ListT m a)) }" という形式のやつ追加してみようと思います

2015-03-27 13:17:19
Kenji Yoshida @xuwei_k

@fumieval それって、ここの wiki.haskell.org/ListT_done_rig… "3.4 Order of ListT []" でListTにList当てはめた場合に bind が associativity 満たさない、って言ってるところですよね?

2015-03-27 13:37:42
Kenji Yoshida @xuwei_k

てか、作成途中の自作ライブラリでListT[List, ?]のassociativeのテスト見事に失敗するし完璧っぽい。これを材料にScalacheckやめてこれ使おうぜ、って突入するか togetter.com/li/800229 github.com/xuwei-k/slides…

2015-03-27 13:43:55
ふみ a.k.a.DJ Monad @fumieval

@xuwei_k そうです。ListTがモナドになるにはベースが可換である必要がありますが、可換なのはIdentityや関数、あるいは可換モノイドのWriterなどごく少数しかなく、どちらにせよモナド変換子にはならないですね。

2015-03-27 14:00:50
Kenji Yoshida @xuwei_k

愚直に実装すると簡単にスタックあふれる → lazyにするとかTrampoline使って頑張る? → それStreamTでは? → つまりやることなかった → そういえばpurescriptではどうなってるんだろう → 完全にscalazのStreamTと同じ実装だった(イマココ

2015-03-27 17:27:58
Kenji Yoshida @xuwei_k

ていうか元は正しかったらしいし、これ github.com/scalaz/scalaz/… で変わっちゃったみたいだし、そして正しかったversionのListTとStreamTの原作者がekmettせんせーだった github.com/scalaz/scalaz/…

2015-03-27 17:36:19

コメント

コメントがまだありません。感想を最初に伝えてみませんか?