«Не может экзистенциально абстрагироваться над параметризованным типом…»

Я возился со Scala 2.8 для развлечения и пытался определитьсутенер который добавляет метод «as» к конструкторам типов, позволяя конвертировать из одного функтора в другой (пожалуйста, не обращайте внимания на тот факт, что я не обязательно имею здесь дело с функторами). Так, например, вы можете использовать это так:

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
    }
}

Однако определениеnaturalTransformations помечен с ошибкой"не может экзистенциально абстрагироваться над параметризованным типом G [T]", Чтобы это исправить я могу переписать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)

и это похоже на работу. Но похоже, что моя первая попытка должна была быть эквивалентной, поэтому мне любопытно, почему она не удалась и что означает сообщение об ошибке.

Ответы на вопрос(2)

Ваш ответ на вопрос