retronymさん(Scalaのコミッターの人)が
Any and nothing are kind polymorphic in scala.
https://groups.google.com/d/msg/scalaz/RTNLhIcFkIc/9uQHD618vDwJ
と言っていて、深く考えたことなかったけど、そういえばそうなのかーと妙に納得したのでメモしておく。*1
Kindの説明は詳しくしませんが、一言でいうと「型の型」という感じでしょうか?詳しく知りたかったら、頑張ってググるか、TAPL(の日本語訳)とか読んでください。
さて、以下のようなA、B、Cがあった場合に
class A[X] class B[X[_]] class C[X[_[_]]]
以下はコンパイルできるが
new A[Int] new B[List] new C[B]
以下はKindが合わないので、コンパイルエラーになる。
new B[Int] new C[Int] new A[List] new C[List] new A[B] new B[B]
しかし、AnyとNothingの場合、以下が全部コンパイル通る
new A[Any] new B[Any] new C[Any] new A[Nothing] new B[Nothing] new C[Nothing]
さて、これが仕様書に書いてあるのかどうかは知らない・・・。*2
ところで、Scala2.11のREPLから:kindコマンドが入りましたが、:kind -v Anyや:kind -v Nothingをすると*3、以下のようになるのですが
scala> :kind -v Nothing scala.Nothing's kind is A * This is a proper type. scala> :kind -v Any java.lang.Object's kind is A * This is a proper type.
「Any and nothing are kind polymorphic」なので、若干不正確なのでは?
追記:
@xuwei_k :kind コマンドの作者なので scala-internal に今後の方針を相談しにいきます
2013-10-17 23:16:50 via YoruFukurou to @xuwei_k
https://groups.google.com/d/msg/scala-internals/m35W4mqo3Yo/EbyvFMNN8QIJ
*1: twitter上を検索したら、runaroramaさんが、昔同じこと言ってますね https://twitter.com/runarorama/status/200623505040089090 https://twitter.com/nuttycom/status/92425055073607680 https://twitter.com/runarorama/status/92408943283945472
*2: http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf 3.5.2に For every type constructor T (with any number of type parameters), scala.Nothing
*3:2.11.0-M6