0

如何解决此类型错误?

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)
4

2 回答 2

2

问题在于 scala 如何推断类型参数。类型信息从左到右跨参数组流动,但不在同一个参数组内。

这意味着: , 的类型参数只有在它出现之前被绑定到参数组中的真实类型时printOption才能被推断出来。在您的中,情况并非如此。所以,有两种方法可以让它工作。AAprintHashCodeAndMap

一世。您可以放弃类型推断并fn通过传递它来显式指定类型printOption[Any]。或者您可以指定printHashCodeAndMap调用它时的类型参数(即printHashCodeAndMap[Any, Any](printOption, optListA)

ii. 如果你想使用 scala 的类型推断,你会希望类型信息A来自optListAwhich is of type List[Option[Any]]。要做到这一点,参数list必须位于前面的参数组中fn。像这样:

def printHashCodeAndMap[A, B](list: List[Option[A]])(fn: Option[A] => Option[B]): List[Option[B]] = { ... }

然后你就可以这样称呼它:

printHashCodeAndMap(optListA)(printOption)
于 2013-01-31T00:49:28.777 回答
1
val optListB = printHashCodeAndMap(printOption[Any], optListA)
于 2013-01-31T00:28:57.213 回答