Scala 2.11, улучшенный с помощью самых масштабных MustMatchers и Await, вызывает ошибку компилятора "при попытке выполнить lub/glb typevar?F[?T,?B]"
Я пытался использовать уточненный с скалярным и получаю ошибки компилятора на этапе "typer": trying to do lub/glb of typevar ?F[?T, ?B]
Это моя лучшая попытка минималистического воспроизведения проблемы с использованием автономного сценария аммонита:
import $ivy.`eu.timepit::refined:0.9.0`
import $ivy.`org.scalatestplus.play::scalatestplus-play:3.1.2`
import org.scalatest.{MustMatchers, WordSpec}
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}
import eu.timepit.refined.auto.autoInfer
class RefinedSpec extends WordSpec with MustMatchers {
val duration = 500.millis
val fut = Future.successful("123")
Await.result(fut, atMost = duration)
}
Если вы внесете одно из следующих изменений в вышеприведенное, оно будет успешно скомпилировано:
- удалять:
import eu.timepit.refined.auto.autoInfer
- Удалить:
with MustMatchers
из определения класса - удалять:
Await.result(fut, atMost = duration)
Для пояснения, это ошибка компиляции, а не ошибка времени выполнения. Первоначальная ошибка возникает в приложении воспроизведения (scala 2.11.11) во время работы test:compile
в sbt, но, вероятно, проще воспроизвести его аммонитовым шрифтом.
Версия аммонита, которую я использую, дает информацию о версии:
Welcome to the Ammonite Repl 1.1.2
(Scala 2.11.12 Java 1.8.0_25)
Устанавливается с использованием:
sudo sh -c '(echo "#!/usr/bin/env sh" && curl -L https://github.com/lihaoyi/Ammonite/releases/download/1.1.2/2.11-1.1.2) > /usr/local/bin/amm && chmod +x /usr/local/bin/amm' && amm
Более подробная информация об ошибке из примера аммонита:
scala.reflect.internal.FatalError:
trying to do lub/glb of typevar ?F[?T, ?B]
while compiling: fail.sc
during phase: typer
library version: version 2.11.12
compiler version: version 2.11.12
reconstructed args: -nowarn -Yresolve-term-conflict:object
last tree to typer: Ident(<argument>)
tree position: line 15 of fail.sc
tree tpe: String
symbol: <none>
symbol definition: <none> (a NoSymbol)
symbol package: <none>
symbol owners:
call site: class RefinedSpec in object fail in package $file
Из игры сб test:compile
Я также получаю такой вывод:
[error] last tree to typer: Ident(<argument>)
[error] tree position: line 13 of ...../RefinedSpec.scala
[error] tree tpe: String
[error] symbol: <none>
[error] symbol definition: <none> (a NoSymbol)
[error] symbol package: <none>
[error] symbol owners:
[error] call site: class RefinedSpec in package foo in package foo
[error]
[error] == Source file context for tree position ==
[error]
[error] 10 val duration = 500.millis
[error] 11 val fut = Future.successful("123")
[error] 12 Await.result(fut, atMost = duration)
[error] 13 }
Это не серьезная проблема, так как я могу просто удалить autoInfer
импортировать как я на самом деле не использую его. Это запутает людей, потому что они будут склонны делать:
import eu.timepit.refined.auto._
чтобы получить автоматическое преобразование из констант времени компиляции в уточненные типы, когда они, вероятно, могут просто сойти с рук:
import eu.timepit.refined.auto.autoRefineV