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)) }
关键修正点
添加
Types特质的隐式生成器:
因为L的value是Types类型,我们需要为Types提供一个隐式的Generate实例,它会根据Types的具体子类(A/B/L)自动匹配对应的子类生成器,实现类型安全的递归解析。修正
L类型的生成器实现:
原代码中lGenerate的泛型参数T没有和L的value类型绑定,导致隐式解析失败。修正后的lGenerate依赖Types的Aux实例,能够递归获取value对应的生成结果,最终输出List[O]类型的结果。递归嵌套支持:
当处理L(L(a,3), 2)时,内层L(a,3)的Generate实例会先被解析为Aux[L, List[Int]],外层的L生成器会基于这个结果,生成List[List[Int]]类型的输出,完美支持嵌套场景。
内容的提问来源于stack exchange,提问作者sanyi14ka
相关产品推荐
相关产品推荐

