Можно ли использовать неявные доказательства для обеспечения статической совместимости типов между абстрактными типами? - PullRequest
8 голосов
/ 06 мая 2011

Примите следующую черту:

trait A {
  type B
  def +(a:A):A
}

Я использую абстрактный тип, потому что я не хочу перетаскивать B в сигнатуре типа каждый раз, когда мне нужен A. Можно ли по-прежнему добавлять какие-либо неявные доказательства (используя =: =, <: <и т. Д.) К методу +, чтобы компилятор мог по-прежнему принудительно принимать a: A с идентичными B? </p>

Мой первый инстинкт - сказать нет, но Скала меня приятно удивила раньше. Любая помощь будет оценена.

1 Ответ

10 голосов
/ 06 мая 2011

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

trait A {
  self =>
  type Self = A { type B = self.B }
  type B
  def +(a : Self) : Self
}

(обратите внимание на использование аннотации собственного типа для предоставления псевдонима для внешнего 'this', позволяющего различать определенные и определяющие буквы B в определении типа Self).

расшифровка стенограммы,

scala> trait A { self => type Self = A { type B = self.B } ; type B ; def +(a : Self) : Self }
defined trait A

scala> val ai = new A { type B = Int ; def +(a : Self) : Self = this }
ai: java.lang.Object with A{type B = Int} = $anon$1@67f797

scala> val ad = new A { type B = Double ; def +(a : Self) : Self = this }
ad: java.lang.Object with A{type B = Double} = $anon$1@7cb66a

scala> ai + ai
res0: ai.Self = $anon$1@67f797

scala> ad + ad 
res1: ad.Self = $anon$1@7cb66a

scala> ai + ad
<console>:9: error: type mismatch;
 found   : ab.type (with underlying type java.lang.Object with A{type B = Double})
 required: ai.Self
       ai + ab
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...