scala - 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 提供自动推导?
解决方案
这里是:
def toCsv[A <: Product](t: A)(using m: scala.deriving.Mirror.ProductOf[A], e: RowEncoder[m.MirroredElemTypes]): List[String] =
e.encodeRow(Tuple.fromProductTyped(t))
推荐阅读
- python - 烧瓶默认pytests失败
- node.js - 如何仅为特定会话维护相同客户端的相同会话 ID?
- vba - 提交表单/网页后的 MS Access VBA Selenium .getText
- javascript - 在 Three.js 中,当用户拖动鼠标时如何获得正确的坐标
- c++ - 初始化指向指针的指针时出现 C++ 错误
- excel - 向下查找未排序的列表以查找大于或等于的值
- xamarin.forms - 如何获取标签的高度
- java - 从普通类调用 JpaRepository 时如何修复 java.lang.NullPointerException?
- docker - 从 Go 与 Google API 对话挂起
- c++ - 为什么编译器不能将 const int 绑定到右值引用?