ScalaScala では def で定義されたメソッドだけが多相性を持つことができ、値である関数は多相性を持つことができない。メソッドを関数に変換すると、そこで型パラメータが適当な型に特定化される。 scala> val id = identity _ id: Nothing => Nothing = メソッドの引き数に多相的な値を渡したりと rank-n 多相のようなことをしたいときにこれでは困ることがある。 scalaz の Forall は、そのようなときに Scala の型システムの範囲内で全称量化された値を扱うためのパッケージである。このパッケージには scala> val singleton = new Forall[({ type X[A] = A => List[A] })#X]{ | def apply[A] = (x : A) => List(x) | } sing