我编写了一个合并的映射函数,该功能将函数应用于迭代,并返回谓词为真的第一个映射结果:
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)