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]
なんじゃこりゃ…