Чтобы сократить время компиляции моего проекта, я кэширую определенные классы типов, которые разрешаются неявным поиском. Это кажется несколько громоздким, потому что прямая реализация не работает:
scala> implicit val x: String = implicitly[String]
x: String = null
Неявный поиск рассматривает собственное неинициализированное определение как допустимую реализацию. lazy val
взорвет стек с бесконечной рекурсией. Поэтому я сейчас обрабатываю это следующим образом:
implicit val x: String = cache.x
object cache {
val x: String = implicitly[String]
}
Но это делает его чрезмерно сложным, и определения кэша не могут легко использовать другие классы кэшированных типов (поскольку они не являются неявными).
Кроме того, скрытие самого значения из области видимости, к сожалению, не работает.
scala> :pas
// Entering paste mode (ctrl-D to finish)
object scope {
implicit val x: String = {
import scope.{ x => _ }
implicitly[String]
}
}
// Exiting paste mode, now interpreting.
defined object scope
scala> scope.x
res0: String = null
Есть ли более элегантный способ добиться кеша неявного разрешения?
cachedImplicit
Shapeless? Это очень похоже тому, что ты делаешь. - person Travis Brown   schedule 21.12.2015