【发布时间】:2017-06-14 11:11:57
【问题描述】:
我有一堆工厂函数,它们都采用相同的参数并返回不同的类型。目前我明确地调用它们,但它非常冗长,我想将工厂泛化为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 更改为对象会使代码编译。如果Poly 被定义为类而不是对象,我如何映射HList?或者有没有更好的模式来应用具有给定参数集的函数 HList 并返回一个新的 HList 和结果?
【问题讨论】: