使用reduceLeft代替scala中的foldLeft

时间:2016-04-28 17:47:46

标签: scala functional-programming fold

我想确保通过使用 reduceLeft 而不是 foldLeft 来实现这一目标。我在列表中搜索给定的数字

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

但是我希望使用 reduceLeft 来完成相同的工作,是否可能?

3 个答案:

答案 0 :(得分:5)

正确的方法是

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

答案 1 :(得分:4)

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

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”比使用其中任何一个选项更好。

答案 2 :(得分:0)

您无法以简单的方式完成此操作。使用foldLeft,您可以定义结果类型:它是累加器的类型,因此我提供了作为第一个参数的零元素的类型。
ReduceLeft使用集合的第一个元素作为累加器的零元素。因此,结果类型将与列表中的元素相同,在您的情况下为Int。