Estaba jugando con Scala 2.8 por diversión y tratando de definir un pimp que agrega un método "como" para escribir constructores, lo que permite convertir de un funtor a otro (Por favor, pase por alto el hecho de que no necesariamente estoy tratando con funtores aquí). Así, por ejemplo, se puede utilizar de esta manera:"no puede existir existencialmente sobre el tipo parametrizado ..."
val array:Array[T]
val list:List[T] = array.as[List]
Así que aquí es lo que he intentado hacer:
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
}
}
sin embargo la definición de naturalTransformations
se marca con el error "no puede existencialmente abstracta sobre el tipo parametrizado G [T] ". Para solucionar este problema, puedo reescribir naturalTransformations
junto con una clase adicional Transformable
así:
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)
y parece trabajar. Pero parece que mi primer intento debería haber sido equivalente, entonces tengo curiosidad por qué falló y qué significa el mensaje de error.
Estoy acostumbrado a ver el error "El tipo de parámetro en el refinamiento estructural puede no referirse a un tipo de resumen definido fuera de ese refinamiento" en situaciones similares. Esa restricción está relacionada con la forma en que los Tipos Estructurales se implementan en la JVM con reflexión, IIRC. http://stackoverflow.com/questions/2685804/scala-parameter-type-in-structural-refinement-may-not-refer-to-an-abstract-type – retronym