私は楽しみのために Scala 2.8 をいじり、型コンストラクターに「as」メソッドを追加して、あるファンクターから別のファンクターに変換できるpimpを定義しようとしていました (ここで必ずしもファンクターを扱っているわけではないという事実を見落としてください)。 . たとえば、次のように使用できます。
val array:Array[T]
val list:List[T] = array.as[List]
だからここに私がやろうとしたことがあります:
object Test {
abstract class NatTrans[F[_], G[_]] {
def convert[T](f:F[T]):G[T]
}
implicit def array2List:NatTrans[Array, List] = new NatTrans[Array, List] {
def convert[T](a:Array[T]) = a.toList
}
// this next part gets flagged with an error
implicit def naturalTransformations[T, F[_]](f:F[T]) = new {
def as[G[_]](implicit n:NatTrans[F, G]) = n convert f
}
}
ただし、 の定義には、 「パラメータ化された型 G[T] を実存的に抽象化できません」naturalTransformations
というエラーが表示されます。これを修正するには、次のように追加のクラスとともに書き直すことができます。naturalTransformations
Transformable
class Transformable[T, F[_]](f:F[T]) {
def as[G[_]](implicit n:NatTrans[F, G]) = n convert f
}
implicit def naturalTransformations[T, F[_]](f:F[T]) = new Transformable[T, F](f)
そしてそれはうまくいくようです。しかし、私の最初の試みは同等だったはずなので、なぜ失敗したのか、エラーメッセージが何を意味するのか興味があります.