在 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)
}
我在这里使用右折叠,因为添加到列表前面比替代方案更好,但您可以轻松地重写它以使用左折叠。
我是 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)
}
我在这里使用右折叠,因为添加到列表前面比替代方案更好,但您可以轻松地重写它以使用左折叠。