scala 需要类型不匹配:选项[任意]=>选项[无]

7lrncoxx  于 2022-11-09  发布在  Scala
关注(0)|答案(2)|浏览(181)

如何修复此类型错误?

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

w1jd8yoj1#

问题出在Scala如何推断类型参数。类型信息在参数组之间从左向右流动,但不在同一参数组内。
这意味着:printOptionA的类型参数只有在A绑定到它出现之前的参数组中的实型时才能被推断。在您的printHashCodeAndMap中,情况并非如此。因此,有两种方法可以让这一点奏效。
I.您可以放弃类型推断,通过传递printOption[Any]来显式指定fn的类型。或者,您可以在调用printHashCodeAndMap时只指定它的类型参数(即printHashCodeAndMap[Any, Any](printOption, optListA))
二、如果您想使用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)
plicqrtu

plicqrtu2#

val optListB = printHashCodeAndMap(printOption[Any], optListA)

相关问题