Я пытаюсь улучшить типы для одного из наших API. Я хочу создать сборщик данных со следующей подписью:
def runIt[T <: HList](id: Int): T = ???
Он должен извлечь вызов внешнего сервера для некоторого объекта и вернуть HList с необходимыми данными. Первая задача - создать список параметров API для необходимых функций.
Вот что я сделал:
import shapeless._
import shapeless.ops.hlist._
trait Feature
trait FeatureFetcher[T] {
def name: String
}
trait F1 extends Feature
trait F2 extends Feature
implicit case object f1Fetcher extends FeatureFetcher[F1] {
val name = "f1name"
}
implicit case object f2Fetcher extends FeatureFetcher[F2] {
val name = "f2name"
}
def makeIt[T <: HList](id: Int)
(implicit liftAll: LiftAll[FeatureFetcher, T]) = {
// I need this, but it does not compile here
// liftAll.instances.toList.map(_.name).mkString(",")
liftAll.instances
}
makeIt[F1 :: F2 :: HNil](1).toList.map(_.name).mkString(",")
Это действительно работает. Но когда я перемещаю .toList
в makeIt
функцию, я получаю ошибку
Error:(25, 21) could not find implicit value for parameter toTraversableAux: shapeless.ops.hlist.ToTraversable.Aux[liftAll.Out,List,Lub]
liftAll.instances.toList.map(_.name).mkString(",")
Как решить эту проблему?