Kotlin折叠错误“使用提供的参数不能调用以下任何函数”

时间:2018-02-18 20:28:42

标签: kotlin fold

我的折叠函数出错了;

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

它没有问题。 是否可以保持函数通用,以便将它用于整数和双精度的列表?

3 个答案:

答案 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")))
}