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 将元组传递给泛型方法时出错_Scala_Generics - Fatal编程技术网

Scala 将元组传递给泛型方法时出错

Scala 将元组传递给泛型方法时出错,scala,generics,Scala,Generics,以下是一个用于记忆/缓存中间结果的函数: def memoize[I, O](f: I => O) = new scala.collection.mutable.HashMap[I, O]() { override def apply(key: I): O = getOrElseUpdate(key, f(key)) } 这对于下面这样的代码非常有效 val double: Int=>Int = memoize { _*2 } 但是,当我尝试使用tupl

以下是一个用于记忆/缓存中间结果的函数:

 def memoize[I, O](f: I => O) = new scala.collection.mutable.HashMap[I, O]() {
   override def apply(key: I): O = getOrElseUpdate(key, f(key))    
 }
这对于下面这样的代码非常有效

val double: Int=>Int = memoize {
    _*2
}
但是,当我尝试使用tuple作为输入参数(I)时,它显示编译时错误

val isGivenNumIsHead:(List[Int], Int) => Boolean = memoize {
  case (Nil, _) => false
  case (a:: as, n) => a == n
}
编译时错误为:

类型可变的表达式。HashMap[Nothing,Boolean]{def apply(key:Nothing):Boolean}不符合预期的类型(List[Int],Int)=>Boolean

这与擦除有关吗


如何修复它?

我假设您希望使用元组作为HashMap中的键。考虑到这一点,下面是解释

memoize
的实际返回类型是
scala.collection.mutable.HashMap[\u,\u]
。分配给类型为
Int=>Int
Function1[Int,Int]
double
(取整数并给出整数的函数)。编译器没有抛出错误,因为
mutable.HashMap
扩展了
scala.collection.mutable.MapLike
,后者依次扩展了
scala.collection.MapLike
,后者依次扩展了
scala.PartialFunction[A,B]
。因此没有编译错误

另一方面,接受一个参数并返回一个值的函数的语法是
val functionName:A=>B=A=>{return B}
,或者可以写成
val function:(A)=>B=A=>{return B}
val function:(A=>B)=>A=>{return B}
。您使用了第二种方法。在这种情况下,A的值应为单一类型。您使用了
List[Int],Int
,它不是单一类型。请注意,我故意删除了括号。因此,为了使其成为一个单一类型并作为元组传递,您必须再使用一组括号。正确的语法应该是

val isGivenNumIsHead:((List[Int], Int)) => Boolean = memoize {
  case (Nil, _) => false
  case (a:: as, n) => a == n
}

注意使用额外的括号使其成为一个元组。

我假设您想使用元组作为HashMap中的键。考虑到这一点,下面是解释

memoize
的实际返回类型是
scala.collection.mutable.HashMap[\u,\u]
。分配给类型为
Int=>Int
Function1[Int,Int]
double
(取整数并给出整数的函数)。编译器没有抛出错误,因为
mutable.HashMap
扩展了
scala.collection.mutable.MapLike
,后者依次扩展了
scala.collection.MapLike
,后者依次扩展了
scala.PartialFunction[A,B]
。因此没有编译错误

另一方面,接受一个参数并返回一个值的函数的语法是
val functionName:A=>B=A=>{return B}
,或者可以写成
val function:(A)=>B=A=>{return B}
val function:(A=>B)=>A=>{return B}
。您使用了第二种方法。在这种情况下,A的值应为单一类型。您使用了
List[Int],Int
,它不是单一类型。请注意,我故意删除了括号。因此,为了使其成为一个单一类型并作为元组传递,您必须再使用一组括号。正确的语法应该是

val isGivenNumIsHead:((List[Int], Int)) => Boolean = memoize {
  case (Nil, _) => false
  case (a:: as, n) => a == n
}

注意使用额外的括号使其成为元组。

我很困惑
memoize
返回一个
HashMap[O,I]
,但是您想返回一个类型为:
(List[Int],Int])=>布尔值的函数吗?我很困惑
memoize
返回一个
HashMap[O,I]
,但是您想返回一个类型为:
(List[Int],Int])=>布尔值的函数
?非常感谢!感谢您的详细和良好的解释!非常感谢你!感谢您的详细和良好的解释!