在 Scala 中使用类型为 类 的抽象类型

Using abstract types with type classes in Scala

我想使用抽象类型 Value 限制为 class Show 来自 cats.

的类型

我的第一次尝试是这样的:

package examples
import cats._
import cats.data._
import cats.implicits._

class UsingShow1 {
  type Value <: Show[Value]  // Not sure if this declaration is right

  def showValues(vs: List[Value]): String = 
    vs.map(implicitly[Show[Value]].show(_)).mkString // Error line

}

但是编译器没有找到隐式参数Show[Value]

我知道我可以将前面的例子定义为:

class UsingShow2[Value: Show] {
  def showValues(vs: List[Value]): String = 
    vs.map(implicitly[Show[Value]].show(_)).mkString
}

但是,我想知道是否可以使用抽象类型而不是类型参数。

像往常一样在使用处简单地添加一个Show[Value]类型的隐式参数:

class UsingShow1 {
  type Value
  def showValues(values: List[Value])(implicit showValue: Show[Value]): String =
    values.map(showValue.show).mkString
}

但是您的 UsingShow2 class 更直接的翻译如下:

class UsingShow1 {
  type Value
  implicit def showValue: Show[Value]

  def showValues(values: List[Value]): String =
    values.map(showValue.show).mkString
}

基本上,由于您已经将类型 参数 Value 换成了 抽象类型成员 ,您还必须将隐式 参数 换成隐式 抽象成员 (在我的示例中为 showValue)。