Kotlin 科特林折叠错误“;以下函数都不能使用提供的参数调用";

Kotlin 科特林折叠错误“;以下函数都不能使用提供的参数调用";,kotlin,fold,Kotlin,Fold,我得到了这个折叠函数的一个错误 fun <T> addAll(num: List<T>) : T = num.fold(0, {x,y -> x+y}) fun addAll(num:List):T=num.fold(0,{x,y->x+y}) 说: 使用提供的参数无法调用以下函数。 但是,如果我这样做: fun addAll(num: List<Int>) : Int = num.fold(0, {x,y -> x+y}) fun add

我得到了这个折叠函数的一个错误

fun <T> addAll(num: List<T>) : T = num.fold(0, {x,y -> x+y})
fun addAll(num:List):T=num.fold(0,{x,y->x+y})
说:

使用提供的参数无法调用以下函数。

但是,如果我这样做:

 fun addAll(num: List<Int>) : Int = num.fold(0, {x,y -> x+y})
fun addAll(num:List):Int=num.fold(0,{x,y->x+y})
它毫无问题地工作。
为了将函数用于整数和双精度的列表,是否可以将其保持为泛型函数?

不幸的是,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))
fun addAll(num:List,zero:T,adder:(T,T)->T:T=
num.fold(零,加法器)
println(addAll(listOf(1,2,3),0,Int::plus))
println(addAll(listOf(1.0,2.0,3.0),0.0,Double::plus))

不幸的是,您不能使用单一的泛型函数,但您可以简单地使用
sum
,它是为许多类型定义的,例如
Iterable
Iterable


这至少可以解决当前的问题:)

另一种方法是使用函数式编程。 只有当您熟悉FP并且需要非常通用的解决方案时,才可以这样做

下面是一个使用库的示例:

导入arrow.core.identity
导入arrow.data.ListKW
导入arrow.data.foldable
导入arrow.data.k
导入arrow.typeclasses.monoid
内联fun addAll(num:List):T=
ListKW.foldable().foldMap(monoid(),num.k(),::identity)
趣味主线(args:Array){
println(addAll(listOf(1,2,3)))
println(addAll(listOf(1.0,2.0,3.0)))
println(addAll(一、二、三个列表)
}

谢谢。我知道sum,但我目前正在尝试学习如何使用泛型函数。好的,我明白了,那么它不是很有用,我猜你不能直接调用fold吗?好的,这已经足够接近了。谢谢。没错:)但我认为这在Arrow(函数库)中是可能的。无论如何,我将添加另一个答案。请注意,这只适用于
addAll
,因为int的幺半群使用
plus
作为其组合操作。。。不知道为什么Arrow会这样做,如果我理解正确的话,
减法
乘法
也会形成幺半群。。。
val doublesSum = listOf(1.0, 2.0).sum()
val intsSum = listOf(1, 2).sum()
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")))
}