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 // Error
)

键入不匹配,预期:( notinferedb)=>布尔值,实际:(nothing)=>任何

如果我使用类型提示虽然可以编译好:

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

为什么从f中推断为B类型CC_1?

在参数列表之间的scala flow中键入推理,而不是内部。

您可以写:

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)

相关内容

  • 没有找到相关文章

最新更新