在 scala 中使用 reduceLeft 代替 foldLeft

Using reduceLeft in place of foldLeft in scala

我想确保我是否可以通过使用 reduceLeft 而不是 foldLeft 来完成此操作。我正在列表中搜索给定号码

val included = List(46, 19, 92).foldLeft(false) { (a, i) =>
| if (a) a else (i == 19)
| }
included: Boolean = true

但是我想使用 reduceLeft 来完成同样的事情,这可能吗?

不直接。通常情况下,类型就是答案。

reduceLeft 的类型类似于:

List[A] => ((A,A) => A) => A

给定一个 A 列表,以及一个可以将 2 个 A 值合并为 1 个 A 值的函数,您将得到一个 A 值。

你可以做的是:

val a = List(46, 19, 92).reduceLeft { (a, b) =>
 if(b == 19) b else a
}

val included = a == 19

当然,使用 "contains" 比这两个选项中的任何一个都更好。

正确的做法是

val included = List(46, 19, 92).contains(19)

但是如果你坚持使用reduceLeft,那么你可以这样写:

val included = List(46, 19, 92).reduceLeft { (a, b) =>
  if (b == 19) b else a
} == 19

你不能用简单的方法来做。使用 foldLeft 你可以定义结果类型:它是你的累加器的类型所以我是你作为第一个参数给出的零元素的类型。
ReduceLeft 使用集合的第一个元素作为累加器的零元素。因此结果类型将与列表的元素相同,在您的情况下为 Int。