You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:15:49