ScalazのTagged Typeに関する重要な変更

https://github.com/scalaz/scalaz/pull/693

tagged typeとは、Haskellnewtypeみたいなやつです。


newtypeみたいといいつつ、今までは、元の型のメソッドもそのまま呼べていて、その点ではHaskellnewtypeと結構異なるものでした。それにより(?)たとえば、こんな問題発生します

https://github.com/scalaz/scalaz/issues/338

これ以外にも色々微妙な問題があります。そもそも、tagged type自体、Scalaのバグか仕様かわからないギリギリのところと、JVMのtype erasureを悪用したものなので、まぁ問題が発生するのは当たり前かもしれません。

それで、「元の型のメソッドを直接呼べない」新しいtagged typeが入りました。よりHaskellnewtypeっぽくなったとも言えます。shapelessにほぼ同等のものがすでにあったようです。

最初は、単に新しいものを追加して、2種類のtagged typeが存在することになる感じだったのですが、「新しいtagged typeのほうがいいし、こっちデフォルトにするか?」「いや、古い方いらないのでは」という流れで、なんと、古いtagged typeは消えました・・・。
そのままメソッド呼べるのは便利だけど、デメリットも結構あって、結局トレードオフな感じです。新しい方は、毎回unwrapしないとメソッド呼べないですが、そのかわり、いくつかのバグを回避できたり、いいこともあるので