我想使用一个抽象类型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
)。