在Scala中使用抽象类型和类型类



我想使用一个抽象类型Value,约束它属于cat的类型类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
}

但是,我想知道是否可以使用抽象类型代替类型参数

只需在使用现场像往常一样添加一个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交换为抽象类型成员,您还必须将隐式参数交换为隐式抽象成员(在我的示例中为showValue)。

相关内容

  • 没有找到相关文章

最新更新