ScalaのAnyとNothingのKind

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」なので、若干不正確なのでは?
追記:

というわけなので、もしかしたら動作変わるかも?
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