Kotlin 中的函数式编程:使用折叠对列表中的元素进行计数
Functional Programming in Kotlin: Counting elements in list by using fold
我的任务是使用 fold(函数式编程)编写一个函数来计算列表中满足谓词的元素数量。我得到了函数签名 fun <A> count(list<A>, predicate: (A) -> Boolean): Int
。 fold不仅要作为迭代使用,还要产生return值。所以我试着这样做:
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)开始,从左到右对当前累加器和每个元素应用操作,还是我弄错了?
编辑(我希望可以编辑问题而不是提出新问题):
是否可以 return 整个列表而不只是一个整数?我刚刚找到 returning 整数或布尔值的例子。我尝试了什么:
我使用了上面相同的函数签名。但是我不想 return 一个 Int,而是 return 一个列表:
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)
return 是布尔值而不是列表,因此 IDE 将其标记为错误。那么有没有办法return一个列表?
提前致谢。
这样试试:
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) { acc, a -> if (predicate(a)) acc+1 else acc }
}
fun main(args: Array<String>) {
val x = listOf<Int>( 1, -2, 3, 10, -5, 8, 12);
println(count(x, { it > 0 && it < 10 }))
}
查看 this site 让我明白了必要的改变。
因为 fold 使用尾递归,所以这种形式是必需的吗?有趣的是,看看原因是什么。
通过说 return
你 return 整个 count
功能。您可以改用 return@fold
。好喜欢
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
return@fold acc + 1
}
return@fold acc
}
}
或者,也许更好的做法是这样做
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
acc + 1
} else {
acc
}
}
}
lambda 中的最后一个表达式隐式也是它的 return 值
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) { acc, a -> acc + predicate(a).run { if (this) 1 else 0 } }
}
我在 kotlin-forum 中找到了如何 return 列表(查看我的问题编辑)的答案:
而不是写作:
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
}
}
}
你可以在kotlin论坛写(以下solution was provided by al3c):
fun <A> returnList(list: List<A>, predicate: (A) -> Boolean): List<A> {
return list.fold(mutableListOf()) {
acc, a ->
if (predicate(a)) {
acc.add(a)
}
acc
}
}
通过这样做,代码 return 不是单个整数、字符或布尔值,而是整个列表。
我的任务是使用 fold(函数式编程)编写一个函数来计算列表中满足谓词的元素数量。我得到了函数签名 fun <A> count(list<A>, predicate: (A) -> Boolean): Int
。 fold不仅要作为迭代使用,还要产生return值。所以我试着这样做:
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)开始,从左到右对当前累加器和每个元素应用操作,还是我弄错了?
编辑(我希望可以编辑问题而不是提出新问题):
是否可以 return 整个列表而不只是一个整数?我刚刚找到 returning 整数或布尔值的例子。我尝试了什么: 我使用了上面相同的函数签名。但是我不想 return 一个 Int,而是 return 一个列表:
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)
return 是布尔值而不是列表,因此 IDE 将其标记为错误。那么有没有办法return一个列表?
提前致谢。
这样试试:
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) { acc, a -> if (predicate(a)) acc+1 else acc }
}
fun main(args: Array<String>) {
val x = listOf<Int>( 1, -2, 3, 10, -5, 8, 12);
println(count(x, { it > 0 && it < 10 }))
}
查看 this site 让我明白了必要的改变。
因为 fold 使用尾递归,所以这种形式是必需的吗?有趣的是,看看原因是什么。
通过说 return
你 return 整个 count
功能。您可以改用 return@fold
。好喜欢
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
return@fold acc + 1
}
return@fold acc
}
}
或者,也许更好的做法是这样做
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
acc + 1
} else {
acc
}
}
}
lambda 中的最后一个表达式隐式也是它的 return 值
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) { acc, a -> acc + predicate(a).run { if (this) 1 else 0 } }
}
我在 kotlin-forum 中找到了如何 return 列表(查看我的问题编辑)的答案:
而不是写作:
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
}
}
}
你可以在kotlin论坛写(以下solution was provided by al3c):
fun <A> returnList(list: List<A>, predicate: (A) -> Boolean): List<A> {
return list.fold(mutableListOf()) {
acc, a ->
if (predicate(a)) {
acc.add(a)
}
acc
}
}
通过这样做,代码 return 不是单个整数、字符或布尔值,而是整个列表。