みなさん、tagged type は勿論知ってますよね! (ぇ
このあたり読んでください↓
一番最初に発見(?)した際のtweet
ねこはる先生による簡単な紹介
specs2の作者のetorreborreさんによる紹介
すでに Scalaz-Seven に入っていますの図
で数日前、milessabinさんが、またそれと似てるけどちょっと違ったversionを作っていました。
Another pass at unboxed newtype in #Scala: URL This time it pretty much is a newtype and not just a tag :-)
2012-02-05 00:39:59 via web
で、その後
(以下すごい適当な訳でお送りします)
「shapeless っていう自分が作ってるライブラリに早速入れたよ!」
#Scala unboxed newtype polished and added to #shapeless: URL Example usage: URL
2012-02-05 22:44:54 via web
「素晴らしい!specs2にも入れたよ!」
@milessabin I used it in specs2, it works great. It's a good progress on the previous version
2012-02-07 13:36:52 via web to @milessabin
その他
https://twitter.com/#!/milessabin/status/166799255183433729
https://twitter.com/#!/etorreborre/status/166843623453900800
的な楽しいやりとりが行われていました。(etorreborreさんとmilessabinさん以外のやりとりもあったけれど)
わかる人はコード見ただけでわかると思いますが、とにかくすごいですね、Scalaの型システムやっぱりキモイというか。ただ、自分のHaskellの知識が無くてあれですが、これがHaskellのnewtypeと全く同じなのか、同じことができるのかどうかは微妙というか、よくわかってません。*1
以前のものは、tag つけて、既存の型を新しい型として解釈する感じです。
が、新しいものは例にあるように
(中のオブジェクトの実態はまったく変わっていないのにもかかわらず) 既存の型のメソッドをなかったことにできます!
個人的に思ったのは、pimp my libraryに似ているんじゃないか?とも思いました。 pimp my library ってメソッドを追加できる(ように見せかけられる) わけですが、pimp my libraryする際に、とりあえず元のオブジェクトのメソッドを全部なかったことにできるという感じでしょうか?
だがそれだったら、最初から新しい型のオブジェクトのをつくって保持しておけばいいじゃないか?とも思うし、ちょっと自分でも使い所がうまくわかってないし説明できません。
たとえば milessabinさんの最初の例だと、結局 mySize っていうメソッドを呼ぶ際に、一度 MyStringOps っていう中間オブジェクトができるわけで、だったら MyStringOps を最初から生成して変数に保持して取り回しても、コスト変わらないのでは?という疑問
しかし、Specs2で早速使っているコードをみたら、あーなるほど、むしろwapperのオブジェクトには、メソッドをなにも追加せずに単に目印的に使えば有用かもしれない(?)
とも思うし、やっぱり自分の中でよく整理できてません。誰か、わかりやすく使いどころ(もしくは、使えない or 使う必要ない理由)を説明してください。自分の理解が深まったか、もしくはtwitterなりgithubを観察して、なにか動きがあれば、追記するか新たに色々書くと思います。