我是Scala的新手,我想编写一个高阶函数(比如说“partition2”),它接受一个整数列表和一个返回true或false的函数。输出将是函数为true的值列表以及函数为false的值列表。我想用折叠来实现这个。我知道这样的事情是一种非常简单的方法:
val (passed, failed) = List(49, 58, 76, 82, 88, 90) partition ( _ > 60 )
我想知道如何使用折叠来应用相同的逻辑。
答案 0 :(得分:4)
您可以先考虑一下您希望累加器的外观。在许多情况下,它会与您想要结束的事物具有相同的类型,并且在此处起作用 - 您可以使用两个列表来跟踪传递和失败的元素。然后你只需要编写案例并将元素添加到适当的列表中:
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)
}
我在这里使用右侧折叠,因为前置列表比替代方案更好,但您可以轻松地重写它以使用左侧折叠。
答案 1 :(得分:3)
你可以这样做:
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)
}
基本上你有两个累加器,当你访问每个元素时,你将它添加到适当的累加器。