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])=>布尔值的函数
?非常感谢!感谢您的详细和良好的解释!非常感谢你!感谢您的详细和良好的解释!