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、その発生に先行するパラメーターグループ内の実際の型にバインドされているA場合にのみ推測できます。AあなたprintHashCodeAndMapの場合、これは当てはまりません。したがって、これを機能させるには2つの方法があります。

私。fn型推論を放棄し、それを渡すことで型を明示的に指定できますprintOption[Any]printHashCodeAndMapまたは、呼び出すときにの型パラメーターを指定することもできます(つまりprintHashCodeAndMap[Any, Any](printOption, optListA)

ii。Scalaの型推論を使用したい場合は、型情報の型を取得する必要AoptListAあり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 に答える