首页 > 解决方案 > Scala 3 - 使用 Product 进行泛型编程

问题描述

根据https://www.scala-lang.org/2021/02/26/tuples-bring-generic-programming-to-scala-3.html

我可以正确地写:

def tupleToCsv[A <: Tuple : RowEncoder](tuple: A): List[String] = summon[RowEncoder[A]].encodeRow(tuple)

case class Employee(name: String, number: Int, manager: Boolean)

val t = Tuple.fromProductTyped(Employee("Bob", 42, false))
println(tupleToCsv(t)) // List(Bob, 42, false)

但我想写一个独特的方法toCsv

   def toCsv[A <: Product](t: A)(using m: scala.deriving.Mirror.ProductOf[A]):  List[String] = {
      val tuple = Tuple.fromProductTyped(t)
      val aa = summon[RowEncoder[A]] // ***
      aa.encodeRow(tuple)
    }

并调用它toCsv(Employee("Bob", 42, false))

第 *** 行的编译器说:

no implicit argument of type RowEncoder[A] was found for parameter x of method summon in object Predef
where:    A is a type in method toCsv with bounds <: Product
      val aa = summon[RowEncoder[A]]

如何为 A 提供自动推导?

标签: scalascala-3

解决方案


这里是:

def toCsv[A <: Product](t: A)(using m: scala.deriving.Mirror.ProductOf[A], e: RowEncoder[m.MirroredElemTypes]): List[String] =
    e.encodeRow(Tuple.fromProductTyped(t))

推荐阅读