Члены типа Scala не компилируются - PullRequest
0 голосов
/ 27 ноября 2018

Я написал следующий простой пример и ожидал, что он будет хорошо скомпилирован:

abstract class TestObject extends App{
  type Type

  def method[F[_]](ft: F[Type], t: Test[F]{
    type Type = TestObject#Type
  }) = t.doSomeAction(ft) //ERROR
}

trait Test[F[_]]{
  type Type
  def doSomeAction(t: F[Type]) = println(t)
}

ideone demo

Но компилятор выводит следующее сообщение об ошибке:

Error:(8, 23) type mismatch;
 found   : ft.type (with underlying type F[TestObject.this.Type])
 required: F[t.Type]
    (which expands to)  F[TestObject#Type]
Note: TestObject.this.Type <: t.Type, but type F is invariant in type _.
You may wish to define _ as +_ instead. (SLS 4.5)
  }) = t.doSomeAction(ft)

Я не совсем понимаю, так как Test#Type = TestObject#Type.

1 Ответ

0 голосов
/ 27 ноября 2018

Итак, проблема в том, что TestObject#Type захватывает экзистенциальный тип, который не тот, который вы хотите.вы хотите убедиться, что Type из определенных экземпляров выстроены в линию.Вы можете сделать это следующим образом:

https://scalafiddle.io/sf/wpI8iGg/0

или чаще с Aux-Pattern

https://scalafiddle.io/sf/wpI8iGg/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...