higher-kind type parameter に渡せるもの

小ネタです。以下のトレイトの型パラメタに渡せるのはどのようなものか。

class T[M[_]]

型パラメタを一つ取るジェネリックなクラス。トレイトでもいいけど。これは普通。

class C[A]
class TC extends T[C]

型パラメタを二つ取るジェネリックなクラスで、片方の型パラメタが束縛済みのものを渡したい場合は?

class D[A, B]
class TIntD extends T[D[Int]] // error: wrong number of type arguments for D, should be 2

型パラメタのカリー化なんてものはサポートされてませんから、これはダメですね。
こういうときは type alias をはさんであげましょう。

type IntD[B] = D[Int, B]
class TIntD extends T[IntD]

type alias も type constructor parameter になるんですねえ。すると最初の例はこんな風にも書ける。

type A[X] = { }
class TA extends T[A]

なんならもっと横着に。

class TA extends T[({ type A[X] = { } })#A]

なんじゃこりゃ…