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