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

Scala嵌套隐式场景下Aux模式失效问题及解决诉求

解决Scala嵌套类型的Generate类型类隐式解析问题

首先,我们需要修正L类型对应的Generate实例实现,同时为Types特质添加隐式解析支持,以处理递归嵌套的场景。

完整修正代码

sealed trait Types

object Types {
  case class A(value: Int) extends Types
  case class B(value: String, flag: Boolean) extends Types
  case class L(value: Types, n: Int) extends Types
}

trait Generate[In] {
  type Out
  def generate(in: In): Out
}

object Generate {
  type Aux[I, O] = Generate[I] { type Out = O }

  // A类型的生成器
  implicit object AGenerate extends Generate[Types.A] {
    override type Out = Int
    override def generate(a: Types.A): Out = a.value
  }

  // B类型的生成器
  implicit object BGenerate extends Generate[Types.B] {
    override type Out = String
    override def generate(b: Types.B): Out = if (b.flag) b.value else "nope"
  }

  // 为Types特质提供隐式生成器,依赖子类的Generate实例
  implicit def typesGenerate[T <: Types, O](implicit gen: Aux[T, O]): Aux[Types, O] = 
    new Generate[Types] {
      override type Out = O
      override def generate(in: Types): O = gen.generate(in.asInstanceOf[T])
    }

  // L类型的生成器,递归依赖value的Generate实例
  implicit def lGenerate[O](implicit gen: Aux[Types, O]): Aux[Types.L, List[O]] = 
    new Generate[Types.L] {
      override type Out = List[O]
      override def generate(in: Types.L): Out = List.fill(in.n)(gen.generate(in.value))
    }

  implicit class RichGenerator[I](in: I) {
    def generate[O](implicit aux: Aux[I, O]): O = aux.generate(in)
  }
}

object Test extends App {
  import Types._
  import Generate._

  val a = A(1)
  val b = B("yep", flag = true)

  println(a.generate) // 输出: 1
  println(b.generate) // 输出: yep
  println(L(a, 3).generate) // 输出: List(1, 1, 1)
  println(L(b, 2).generate) // 输出: List(yep, yep)
  println(L(L(a,3), 2).generate) // 输出: List(List(1, 1, 1), List(1, 1, 1))
}

关键修正点

  1. 添加Types特质的隐式生成器:
    因为L的value是Types类型,我们需要为Types提供一个隐式的Generate实例,它会根据Types的具体子类(A/B/L)自动匹配对应的子类生成器,实现类型安全的递归解析。

  2. 修正L类型的生成器实现:
    原代码中lGenerate的泛型参数T没有和L的value类型绑定,导致隐式解析失败。修正后的lGenerate依赖Types的Aux实例,能够递归获取value对应的生成结果,最终输出List[O]类型的结果。

  3. 递归嵌套支持:
    当处理L(L(a,3), 2)时,内层L(a,3)的Generate实例会先被解析为Aux[L, List[Int]],外层的L生成器会基于这个结果,生成List[List[Int]]类型的输出,完美支持嵌套场景。

内容的提问来源于stack exchange,提问作者sanyi14ka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:45