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)
我编写了一个组合的 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)