Scala: проблема с частично примененными конструкторами типов - PullRequest
0 голосов
/ 21 декабря 2018

Я определил следующий тип псевдонима:

type PartiallyAppliedEither[A] = Either[String, A]

Я вижу, что следующие компиляции:

def checkTypeEquality1(implicit ev: PartiallyAppliedEither[_] =:= Either[String, _]) = 1

checkTypeEquality1 //compiles

, но это не так:

def checkTypeEquality2[A](implicit ev: PartiallyAppliedEither[A] =:= Either[String, A]) = 1 

checkTypeEquality2 //fails to compile.

def checkTypeEquality3[A](implicit ev: PartiallyAppliedEither[A] =:= Either[String, _]) = 1

checkTypeEquality3 //fails to compile.

Почему первое равенство разрешено, а другое нет?

1 Ответ

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

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

Это ведет себя полностью, как и ожидалось:

type PartiallyAppliedEither[A] = Either[String, A]
def checkTypeEquality1(implicit ev: PartiallyAppliedEither[_] =:= Either[String, _]) = 1
checkTypeEquality1      // compiles
def checkTypeEquality2[A](implicit ev: PartiallyAppliedEither[A] =:= Either[String, A]) = 1 
checkTypeEquality2[Int] // compiles
def checkTypeEquality3[A](implicit ev: PartiallyAppliedEither[A] =:= Either[String, _]) = 1
checkTypeEquality3[Int] // doesn't compile, because it shouldn't.

Последний не компилируется, потому что если бы он это сделал, это означало бы, что каждый тип равен любому другому типу, но это не так.

...