繁体   English   中英

使用Scala中的fold实现分区函数

[英]Implement a partition function using a fold in Scala

我是Scala的新手,我想编写一个高阶函数(比如说“partition2”),它接受一个整数列表和一个返回true或false的函数。 输出将是函数为true的值列表以及函数为false的值列表。 我想用折叠来实现这个。 我知道这样的事情是一种非常简单的方法:

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

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

您可以从思考积累器的外观开始。 在许多情况下,它将与您想要结束的事物具有相同的类型,并且在此处起作用 - 您可以使用两个列表来跟踪传递和失败的元素。 然后你只需要编写案例并将元素添加到适当的列表中:

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)
}

我在这里使用正确的折叠,因为前置列表比替代更好,但你可以轻松地重写它以使用左折叠。

你可以这样做:

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)
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM