【问题标题】:How to make type classes resolve for base/abstract class?如何使类型类解析为基类/抽象类?
【发布时间】:2018-06-26 19:43:29
【问题描述】:

假设我有一个基本抽象类和 2 个扩展它的案例类。

sealed abstract class Base extends Product with Serializable

case class A(d: String) extends Base
case class B(d: Int) extends Base

例如,我在AB 上也有一个类型类

trait Show[T] {
  def show(t: T): String
}

object Show {
  def apply[T](t: T)(implicit show: Show[T]): String = show.show(t)

  implicit val showA: Show[A] = new Show[A] {
    def show(t: A): String = "A"
  }

  implicit val showB: Show[B] = new Show[B] {
    def show(t: B): String = "B"
  }
}

我遇到的问题是,在我的代码中,我从反序列化中得到AB,它们的类型为Base。在这种情况下,scala 无法解析类型类,因为Base 上没有定义类型类。

我可以通过在Base 上定义一个实例并进行模式匹配来解决这个问题,但 IMO 以这种方式我们最好不要使用类型类。

有什么技巧可以让 scala 为基类解析类型类吗? 谢谢。

【问题讨论】:

  • 我没有时间写一个完整的答案,但你绝对可以使用 Shapeless 或 Magnolia (magnolia.work) 并为密封特征派生一个实例。如果您使用猫,您可以查看小猫github.com/milessabin/kittens

标签: scala typeclass


【解决方案1】:

不,没有这样的伎俩。类型必须是静态已知的,因为解析类型类实例的是编译器。

正如您所说,必须创建一个可以解析正确实例的Base 实例。它可以手动完成,但可能有更好的方法来做到这一点。也许有人可以就如何做得更好提供更好的答案,但基本上需要Base 的实例。

【讨论】:

    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2011-10-10
    • 2020-04-05
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多