我想使用约束属于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
}
但是,我想知道是否可以使用抽象类型而不是类型参数。
答案 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
)。