基于Shapeless HList实现WorkItem链式组合的问题求助
基于Shapeless HList实现WorkItem组合工具的问题
背景与需求
我正尝试基于Shapeless HList为一系列WorkItem构建组合工具,现有WorkItem类定义如下:
class WorkItem[-A, B](name: String)(val work: A => B) { // 一些额外方法 def andThen[C](anotherWork: WorkItem[B, C]): WorkItem[A,C] = { // 使用Cats的Arrow组合 WorkItem(anotherWork.name)(work >>> anotherWork.work) } }
现有以下WorkItem实例:
val workItem1: WorkItem[Int, String] = { .... } val workItem2: WorkItem[String, Double] = { ..... } val workItem3: WorkItem[Double, Int] = { ..... }
我希望实现组合功能,将上述HList格式的WorkItem列表合并为WorkItem[Int, Int],期望的WorkItemComposer结构如下:
object WorkItemComposer { def compose[A, B, C, L <: HList](workItems: L): WorkItem[A, C] { /// 实现逻辑 } }
使得调用WorkItemComposer.compose(workItem1 :: workItem2 :: workItem3 :: HNil)能返回WorkItem[Int, Int]。
已尝试的实现
我创建了一个Poly2实例:
object WorkItemCompose extends Poly2 { implicit def composedFunctions[A, B, C]: Case[WorkItem[A, B], WorkItem[B, C]] { type Result = WorkItem[A, C] } = use{ (x: WorkItem[A, B], y: WorkItem[B, C]) => x andThen y } }
然后实现了WorkItemComposer:
object WorkItemComposer { import shapeless.ops.hlist._ def compose[L <: HList](l: L)(implicit reducer: LeftReducer[L, WorkItemCompose.type]): reducer.Out = reducer(l) }
遇到的编译错误
调用时触发编译错误:
could not find implicit value for parameter reducer: shapeless.ops.hlist.LeftReducer[WorkItem[Int,String] :: WorkItem[String,Double] :: WorkItem[Double,Int] :: shapeless.HNil, WorkItemCompose.type]
val finalTester= WorkItemComposer.compose(workItem1 :: workItem2 :: workItem3 :: HNil)
我确定遗漏了让编译器识别可遍历HList并合并为单个WorkItem的逻辑,但因对Shapeless经验不足无法补全,请求帮助完善实现。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

