https://github.com/xuwei-k/scalaz-prototype
scalaz8に向けて継承やめよう、みたいなissueがかるく盛り上がっていたので、自分が思いついた別の方法貼っておきました
https://github.com/scalaz/scalaz/issues/1084
型クラスで継承使ってるデメリットは、たとえば
- classではなくtraitにしないといけなくて、メソッド追加時のバイナリ互換維持ができない
- 型クラスのインスタンス定義時にimplicitの衝突回避の工夫をする必要がある(継承順によりimplicitの優先順位が変えることが可能なので、そのためのclassかtraitを大量に作る)
- その他にも色々ある気がする
ですが、自分が思いついたやつは「型クラスのインスタンス定義時にimplicitの衝突回避の工夫」を軽減するものです。
現状、相変わらずtraitは使うのでバイナリ互換維持は解決しません。
そもそも色々トレードオフだし、思いついたから貼ったけど、これが現状と比べてすごくいいか?というとそうでもないと思うので、まぁ他のscalazコミッターで頑張りたい人に任せようかな、どうしようかな・・・。
自分のものは、KleisliやListの定義例みてもらうとわかると思いますが、implicit衝突を考えなくて良くなったかわりに、微妙に面倒な部分も増えています。