如何修复此类错误?
object Test extends App {
def printOption[A](a: Option[A]): Option[A] = { println(a getOrElse("none")); a }
def printHashCodeAndMap[A, B](fn: Option[A] => Option[B], list: List[Option[A]]): List[Option[B]] = {
for (elem <- list) yield fn(elem.map{a => println(a.hashCode()); a})
}
val optListA = List(Some("aa"), None, Some(5))
val optListB = printHashCodeAndMap(printOption, optListA)
for (x <- optListB) printOption(x)
}
我得到的错误是:
error: type mismatch;
found : Option[Nothing] => Option[Nothing]
required: Option[Any] => Option[Nothing]
val optListB = printHashCodeAndMap(printOption, optListA)
答案 0 :(得分:2)
问题在于scala如何推断类型参数。类型信息跨参数组从左到右流动,但不在同一参数组内。
这意味着:printOption
,A
的类型参数只有在A
绑定到参数组中的实际类型时才能推断出来。在printHashCodeAndMap
中,情况并非如此。因此,有两种方法可以使其发挥作用。
我。您可以放弃类型推断,并通过传递fn
来明确指定printOption[Any]
的类型。或者您可以在调用它时指定printHashCodeAndMap
的类型参数(即printHashCodeAndMap[Any, Any](printOption, optListA)
)
II。如果您想使用scala的类型推理,您希望A
的类型信息来自optListA
List[Option[Any]]
类型。要实现这一点,参数list
必须位于fn
之前的参数组中。像这样:
def printHashCodeAndMap[A, B](list: List[Option[A]])(fn: Option[A] => Option[B]): List[Option[B]] = { ... }
然后你可以这样称呼它:
printHashCodeAndMap(optListA)(printOption)
答案 1 :(得分:1)
val optListB = printHashCodeAndMap(printOption[Any], optListA)