github.com/scalaz/scalaz/… ScalazのListT、transformersのやつをそのまま移植してしまったのか…
2015-03-27 12:26:17@xuwei_k はい。transformersのListTはモナドではなく、本来はこの世界から抹消されるべき存在と言っても過言ではないでしょう。
2015-03-27 12:37:30@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これ twitter.com/fumieval/statu… このときにテスト通らなくて結論もあまりでないままcloseした件 github.com/scalaz/scalaz/… と関係あるのかな
2015-03-27 13:03:59@fumieval なるほど。"実装の一つ" というのは、同型で複数の実装がありえる(チャーチエンコーディングとかすれば?) という話ですか?
2015-03-27 13:07:39@fumieval あとさっきのページだと、IOと組み合わせた場合の例がでてたり "unnecessary strictness"と言ってるので、遅延評価が関係してくる(つまりScalaだと事情が異なる場合ある?)けど、遅延評価関係なくてもあの実装じゃダメ、ということなんですかね
2015-03-27 13:10:12@xuwei_k 必ずしもそうではない場合もあります。たとえばpipes(hackage.haskell.org/package/pipes-…)で定義されているListTは微妙に異なりますが、これも正しい実装になります。
2015-03-27 13:12:16@xuwei_k 確かに評価の問題もありますが、評価順序関係なしにListTはモナド変換子ではないのでそこが最も深刻な問題です。
2015-03-27 13:15:31github.com/scalaz/scalaz/… そういえば、StreamTのほうは、これ twitter.com/xuwei_k/status… と同型? で、たぶん正しさがある
2015-03-27 13:15:47@fumieval なるほど、ありがとうございます。あとで、既存のもの変更(修正)するか、別の "newtype ListT m a = ListT { runListT :: m (Maybe (a, ListT m a)) }" という形式のやつ追加してみようと思います
2015-03-27 13:17:19@fumieval それって、ここの wiki.haskell.org/ListT_done_rig… "3.4 Order of ListT []" でListTにList当てはめた場合に bind が associativity 満たさない、って言ってるところですよね?
2015-03-27 13:37:42てか、作成途中の自作ライブラリでListT[List, ?]のassociativeのテスト見事に失敗するし完璧っぽい。これを材料にScalacheckやめてこれ使おうぜ、って突入するか togetter.com/li/800229 github.com/xuwei-k/slides…
2015-03-27 13:43:55@xuwei_k そうです。ListTがモナドになるにはベースが可換である必要がありますが、可換なのはIdentityや関数、あるいは可換モノイドのWriterなどごく少数しかなく、どちらにせよモナド変換子にはならないですね。
2015-03-27 14:00:50愚直に実装すると簡単にスタックあふれる → lazyにするとかTrampoline使って頑張る? → それStreamTでは? → つまりやることなかった → そういえばpurescriptではどうなってるんだろう → 完全にscalazのStreamTと同じ実装だった(イマココ
2015-03-27 17:27:58ていうか元は正しかったらしいし、これ github.com/scalaz/scalaz/… で変わっちゃったみたいだし、そして正しかったversionのListTとStreamTの原作者がekmettせんせーだった github.com/scalaz/scalaz/…
2015-03-27 17:36:19