【发布时间】:2020-12-02 10:24:32
【问题描述】:
当我在 Scala 中有一个函数时:
def toString[T: Show](xs: T*): String = paths.map(_.show).mkString
以及范围内的以下类型类实例:
implicit val showA: Show[MyTypeA]
implicit val showB: Show[MyTypeB]
我可以通过以下方式使用函数toString:
val a1: MyTypeA
val a2: MyTypeA
val stringA = toString(a1, a2)
val b1: MyTypeB
val b2: MyTypeB
val stringB = toString(b1, b2)
但是我不能调用toStringMyTypeA和MyTypeB类型的混合参数:
// doesn't compile, T is inferred to be of type Any
toString(a1, b1)
是否可以重新定义toString,以便可以混合不同类型的参数(但仅适用于Show 类型类)?
请注意,我知道 cat show interpolator 可以解决这个特定示例,但我正在寻找一种也可以应用于不同情况的解决方案(例如toNumber)。
我也知道通过在将参数传递给toString 函数之前调用参数上的.show 来规避问题,但我正在寻找一种方法来避免这种情况,因为它会导致代码重复。
【问题讨论】:
-
遗憾的是,这并不容易。我知道使用 Shapeless 是可能的,但它相当复杂。另一种解决方案是 magnet 模式。
-
看起来确实不容易,尽管答案表明使用 shapeless 是可能的。最终,我选择在传递每个参数之前调用
.show,因为它的侵入性最小。
标签: scala polymorphism typeclass implicit scala-cats