输入参数推断错误

时间:2013-01-31 00:21:02

标签: scala option typeerror

如何修复此类错误?

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 个答案:

答案 0 :(得分:2)

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

这意味着:printOptionA的类型参数只有在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)