Я развлекался со Scala 2.8 для забавы и пытался определить pimp , который добавляет метод "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)
, и он работает.Но похоже, что моя первая попытка должна была быть эквивалентной, поэтому мне любопытно, почему она не удалась и что означает сообщение об ошибке.