在Scala中使用带有类型类的抽象类型

时间:2016-08-12 08:42:20

标签: scala scala-cats

我想使用约束属于cats类型类Value的抽象类型Show

我的第一次尝试将是:

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
}

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

1 个答案:

答案 0 :(得分:5)

只需像往常一样在使用网站上添加类型为Show[Value]的隐式参数:

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

但您对UsingShow2课程的更直接的翻译如下:

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

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

基本上,既然您已经为抽象类型成员交换了类型参数 Value,那么您还必须交换隐含的参数< / em>用于隐式抽象成员(在我的示例中为showValue)。