Shapeless - применение заводских функций с HList

У меня есть несколько заводских функций, которые принимают одинаковые аргументы и возвращают разные типы. В настоящее время я вызываю их все явно, но это очень многословно, и я хочу обобщить фабрики в HList и вызвать каждый, сопоставляя HList,

case class Endpoint[A](a: A)

case class Factory[Ret](f: Int => Endpoint[Ret])

val factories = Factory[Int](a => Endpoint(a)) :: Factory[String](a => Endpoint(a.toString)) :: HNil

Я определил Poly1 так что я могу сопоставить мой HList и применить f для каждого элемента

case class ApplyFactory(param: Int) extends Poly1 {
  implicit def generic[A]: Case.Aux[Factory[A], Endpoint[A]] =
    at((factory: Factory[A]) => factory.f(param))
}

val endpoints = factories.map(ApplyFactory(5))

Проблема в том, что could not find implicit value for parameter mapper, изменения ApplyFactory объект делает компиляцию кода. Как мне нанести на карту HList если Poly определяется как класс, а не объект? Или есть лучший шаблон для применения HList функций с заданным набором параметров и возвращая новый HList с результатом?

1 ответ

Решение

Не беспокойся PolyТолько что реализовал любую нужную карту вручную:

trait FactoryMap[L <: HList] {
  type Out <: HList
  def map(i: Int, h: L): Out
}

object FactoryMap {
  type Aux[L <: HList, O <: HList] = FactoryMap[L] { type Out = O }

  implicit def caseNil: Aux[HNil, HNil] = new FactoryMap[HNil] {
    type Out = HNil
    def map(i: Int, l: HNil): HNil = l
  }

  implicit def caseCons[T <: HList, O <: HList]
    (implicit ev: Aux[T, O]) = new FactoryMap[Factory[Int] :: T] {
      type Out = Endpoint[Int] :: O
      def map(i: Int, l: Factory[Int] :: T): Endpoint[Int] :: O = {
        val (h :: t) = l
        h.f(i) :: ev.map(i, t)
      }
    }
}

implicit case class MyMap[L <: HList](l: L) {
  def customMap[O <: HList](i: Int)(implicit ev: FactoryMap.Aux[L, O]): O =
    ev.map(i, l)
}

В отличие от Polyобобщая вышесказанное на любой Ret (и не Ret = Int как я и сделал) относительно просто.

Другие вопросы по тегам