Scala 类型推断错误

Scala type inference error

我编写了一个组合的 map-and-find 函数,它将函数应用于 Iterable 和 returns 谓词为真的第一个映射结果:

implicit class EnhancedIterable[A, B[X] <: Iterable[X]](it: B[A]) {

  def mapAndFind[B](f: A => B, p: B => Boolean): Option[B] = {
    var result: Option[B] = None
    for (value <- it if result.isEmpty) {
      val r = f(value)
      if (p(r))
        result = Some(r)
    }
    result
  }

}

问题是当我尝试按预期使用函数时遇到编译错误:

val names = Seq("Jose", "Chris", "Carlos", "Stephan")

names.mapAndFind(
  _.length,
  _ > 5 // Error
)

Type mismatch, expected: (NotInferedB) => Boolean, actual: (Nothing) => Any

如果我使用类型提示虽然编译正常:

names.mapAndFind(
  _.length,
  (len: Int) => len > 5
)

为什么类型 B 没有从 f 推断为 Int

Scala 中的类型推断流 参数列表之间,而不是在它们内部。

你可以这样写:

implicit class EnhancedIterable[A, B[X] <: Iterable[X]](it: B[A]) {
  def mapAndFind[B](f: A => B)(p: B => Boolean): Option[B] = {
    var result: Option[B] = None
    for (value <- it if result.isEmpty) {
      val r = f(value)
      if (p(r)) result = Some(r)
    }
    result
  }
}

然后:

val names = Seq("Jose", "Chris", "Carlos", "Stephan")
names.mapAndFind(_.length)(_ > 5)

产量:

Some(6)