我的折叠函数出错了;
fun <T> addAll(num: List<T>) : T = num.fold(0, {x,y -> x+y})
话说:
使用提供的参数无法调用以下任何函数。
但是,如果我这样做:
fun addAll(num: List<Int>) : Int = num.fold(0, {x,y -> x+y})
它没有问题。 是否可以保持函数通用,以便将它用于整数和双精度的列表?
答案 0 :(得分:1)
不幸的是,Kotlin目前不允许对所有数字类型的运算符进行抽象(我相信能够在JVM运行时使用原始数字)。
所以你能得到的最好的就是这样:
fun <T> addAll(num: List<T>, zero: T, adder: (T, T) -> T) : T =
num.fold(zero, adder)
println(addAll(listOf(1,2,3), 0, Int::plus))
println(addAll(listOf(1.0,2.0,3.0), 0.0, Double::plus))
答案 1 :(得分:1)
虽然您遗憾的是无法使用单个通用函数执行此操作,但您可以使用为sum
类型Iterable<Int>
以及{{1}等许多Iterable
类型定义的Iterable<Double>
}}:
val doublesSum = listOf(1.0, 2.0).sum()
val intsSum = listOf(1, 2).sum()
这至少可以解决当前的问题:)
答案 2 :(得分:0)
另一种方法是使用函数式编程。 只有熟悉FP并且需要非常通用的解决方案才能做到这一点。
以下是使用Arrow库的示例:
import arrow.core.identity
import arrow.data.ListKW
import arrow.data.foldable
import arrow.data.k
import arrow.typeclasses.monoid
inline fun <reified T> addAll(num: List<T>): T =
ListKW.foldable().foldMap(monoid(), num.k(), ::identity)
fun main(args: Array<String>) {
println(addAll(listOf(1, 2, 3)))
println(addAll(listOf(1.0, 2.0, 3.0)))
println(addAll(listOf("one", "two", "three")))
}