Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 以泛型方式为Seq集合创建隐式类型类实例_Scala_Typeclass_Implicit - Fatal编程技术网

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