継承ではなくself typeを使って型クラスの関係を表現する

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衝突を考えなくて良くなったかわりに、微妙に面倒な部分も増えています。