Scala 以泛型方式为Seq集合创建隐式类型类实例
我正在尝试为以下结构编写通用隐式实例:Scala 以泛型方式为Seq集合创建隐式类型类实例,scala,typeclass,implicit,Scala,Typeclass,Implicit,我正在尝试为以下结构编写通用隐式实例: object SmartHasher { trait GetSmartHash[T] { def calculateHash(value: T): Int } object syntax { implicit class GetHashOps[T: GetSmartHash](itemToBeHashed: T) {
object SmartHasher {
trait GetSmartHash[T] {
def calculateHash(value: T): Int
}
object syntax {
implicit class GetHashOps[T: GetSmartHash](itemToBeHashed: T) {
def hashItSmartway(implicit GetSmartHashInstance: GetSmartHash[T]): Int =
GetSmartHashInstance.calculateHash(itemToBeHashed)
}
}
object instances {
import syntax._
implicit def stringSmartHash: GetSmartHash[String] = (s: String) =>s.size % 10 // smart demo thing :D
}
现在我试图定义一个通用的隐式实例,它适用于任何向量、列表或数组
其中定义了其元素的smarthash方法
:
我应该用什么样的类型来代替Seq,因为我试着用它,但它不起作用
如果我为向量这样的精确集合定义它:
implicit def sequenceHash[T: GetSmartHash]: GetSmartHash[Vector[T]] =
(sequence: Vector[T]) => sequence.map(element => element.hashItSmartway).product
然后它就像我预期的那样工作。
有没有建议以通用的方式为SE 3集合编写此代码,以防止类似代码重复3次?
问候。试试看
object instances {
import syntax._
// stringSmartHash ...
implicit def sequenceHash[Col[X] <: Iterable[X], T: GetSmartHash]: GetSmartHash[Col[T]] =
(sequence: Col[T]) => sequence.map(element => element.hashItSmartway).product
}
如果希望sequenceHash
也适用于Array
将上限替换为视图边界
implicit def sequenceHash[Col[_], T: GetSmartHash](implicit ev: Col[T] => Iterable[T]): GetSmartHash[Col[T]] =
(sequence: Col[T]) => sequence.map(element => element.hashItSmartway).product
试一试
如果希望sequenceHash
也适用于Array
将上限替换为视图边界
implicit def sequenceHash[Col[_], T: GetSmartHash](implicit ev: Col[T] => Iterable[T]): GetSmartHash[Col[T]] =
(sequence: Col[T]) => sequence.map(element => element.hashItSmartway).product
“我应该用什么类型来代替
Seq
,因为我试着用它,但它不起作用?”你说的“不起作用”是什么意思?“如果我为Vector这样的精确集合定义它:……那么它就如我所预期的那样工作。”你说的“按预期工作”是什么意思?提供有关所需行为和当前问题的详细信息。它编译并运行,如果我使用Seq,则我得到编译错误:value hashItSmartway不是scala.collection.immutable.Vector的成员。我认为编译器在输入向量或ListBTW中时未捕获带有Seq的签名,您可能希望使隐式类也成为值类,以避免对扩展方法进行实例化。“我应该使用什么类型来代替Seq
,因为我正在尝试使用它,但它不起作用?”您所说的“不起作用”是什么意思?“如果我为Vector这样的精确集合定义它:……那么它就如我所预期的那样工作。”你说的“按预期工作”是什么意思?提供有关所需行为和当前问题的详细信息。它编译并运行,如果我使用Seq,则我得到编译错误:value hashItSmartway不是scala.collection.immutable.Vector的成员。我认为编译器在输入向量或ListBTW中时未捕获带有Seq的签名,您可能希望使隐式类也成为值类,以避免扩展方法的实例化。
implicit def sequenceHash[Col[_], T: GetSmartHash](implicit ev: Col[T] => Iterable[T]): GetSmartHash[Col[T]] =
(sequence: Col[T]) => sequence.map(element => element.hashItSmartway).product