在 Scala 中使用折叠实现分区函数

Implement a partition function using a fold in Scala

我是 Scala 的新手,我想编写一个高阶函数(比如 "partition2"),它接受一个整数列表和一个 returns 为真或假的函数。输出将是函数为真的值列表和函数为假的值列表。我想用折叠来实现这个。我知道这样做是一种非常简单的方法:

val (passed, failed) = List(49, 58, 76, 82, 88, 90) partition ( _ > 60 )

我想知道如何使用折叠来应用相同的逻辑。

你可以这样做:

List(49, 58, 76, 82, 88, 90).foldLeft((Vector.empty[Int], Vector.empty[Int])){
  case ((passed, failed), x) => 
    if (x > 60) (passed :+ x, failed)
    else (passed, failed :+ x)
}

基本上你有两个累加器,当你访问每个元素时,你将它添加到适当的累加器中。

您可以先考虑您希望累加器的外观。在许多情况下,它的类型与您最终想要的类型相同,这在这里起作用——您可以使用两个列表来跟踪通过和失败的元素。然后你只需要编写案例并将元素添加到适当的列表中:

List(49, 58, 76, 82, 88, 90).foldRight((List.empty[Int], List.empty[Int])) {
  case (i, (passed, failed)) if i > 60 => (i :: passed, failed)
  case (i, (passed, failed)) => (passed, i :: failed)
}

我在这里使用右折叠,因为添加到列表前面比替代方案更好,但您可以轻松地重写它以使用左折叠。