【发布时间】:2022-01-19 12:43:02
【问题描述】:
我的任务是使用 fold(函数式编程)编写一个函数来计算列表中满足谓词的元素数量。我得到了函数签名fun <A> count(list<A>, predicate: (A) -> Boolean): Int。折叠不仅要用作迭代,还要生成返回值。所以我尝试这样做:
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
return acc + 1
}
return acc
}
}
我写了一个 println 来检查它是否有效:
println(count3(listOf (1, -2, 3, 10, -5, 8, 12), { it > 0 && it < 10 }))
但是,我在控制台上得到的结果是 1 而不是 3,我不知道问题出在哪里。那么,有没有人知道我的错误在哪里或者我可以如何实现该功能?
并且要明确一点:Fold 累加一个值,从初始值(在本例中为 0)开始,并将从左到右的操作应用于当前累加器和每个元素,还是我弄错了?
编辑(我希望可以编辑一个问题而不是问一个新问题):
是否可以返回整个列表而不仅仅是一个 int?我刚刚找到了返回整数或布尔值的示例。我尝试了什么: 我使用了上面相同的函数签名。但我不想返回一个 Int,而是返回一个列表:
fun <A> returnList(list: List<A>, predicate: (A) -> Boolean): List<A> {
return list.fold(mutableListOf()) {
acc, a ->
if (predicate(a)) {
acc.add(a)
} else {
acc
}
}
}
我发现的问题是acc.add(a) 返回的是布尔值而不是列表,因此IDE 将其标记为错误。那么有没有办法返回一个列表呢?
提前致谢。
【问题讨论】:
标签: list kotlin generics functional-programming fold