Проблема компиляции с псевдонимом типа upperKinds - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть черта типа

trait T{
  type F[_]
  def get[A](f: F[A]): A
}

Но я не могу ее реализовать

type Id[+A] = A // same as shapeless Id

object O extends T{
  type F[_] = Id[_]
  def get[A](f: F[A]): A = f // 
}
// error: type mismatch;
// found   : f.type (with underlying type O.F[A])
// required: A
//       def get[A](f: F[A]): A = f
//                                ^

(заметьте, я думаю, что мне следует работать, если я разыграю f.asIntanceOf[A], но я не пытался)

У меня та же проблема с Future:

import scala.concurrent.Await
import scala.concurrent.Future
import scala.concurrent.duration.Duration
object O2 extends T{
  type F[_] = Future[_]
  def get[A](f: F[A]): A = Awaits.result(f, Duration.Inf)
}
// error: type mismatch;
// found   : scala.concurrent.Future[_$1] where type _$1
// required: scala.concurrent.Awaitable[A]
//   def get[A](f: F[A]): A = Await.result(f, Duration.Inf)
//                                         ^

Может кто-нибудь объяснить мне, что происходит?Почему компилятор не может понять фактический тип F[A] использует псевдоним вышеупомянутого типа?

1 Ответ

0 голосов
/ 03 декабря 2018

Вы, вероятно, хотели написать

type F[X] = Id[X]

и

type F[X] = Future[X]

Пример:

trait T { type F[_]; def get[A](f: F[A]): A }
object Foo extends T { 
  type F[X] = List[X]
  def get[A](f: List[A]): A = f.head 
}

Я предполагаю, что вам придется ждать Дотти и полныйподдержка лямбда-типов, пока вы не можете отбросить избыточный аргумент с обеих сторон.

...