如何修复此类型错误?
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)
2条答案
按热度按时间w1jd8yoj1#
问题出在Scala如何推断类型参数。类型信息在参数组之间从左向右流动,但不在同一参数组内。
这意味着:
printOption
,A
的类型参数只有在A
绑定到它出现之前的参数组中的实型时才能被推断。在您的printHashCodeAndMap
中,情况并非如此。因此,有两种方法可以让这一点奏效。I.您可以放弃类型推断,通过传递
printOption[Any]
来显式指定fn
的类型。或者,您可以在调用printHashCodeAndMap
时只指定它的类型参数(即printHashCodeAndMap[Any, Any](printOption, optListA)
)二、如果您想使用Scala的类型推断,您会希望
A
的类型信息来自optListA
,其类型为List[Option[Any]]
。为此,参数list
必须位于fn
之前的参数组中。就像这样:然后你就可以这样称呼它了:
plicqrtu2#