Kotlin 中的偏函数应用

sir*_*sel 5 partial-application kotlin

我在部分函数应用程序的语法方面遇到问题。以下代码工作正常,并输出:two-three-four

import kotlin.coroutines.experimental.*

inline fun <T> Iterable<T>.forEachFrom(beg:Int, act:(T)->Unit) {
  var i=0;  if (beg>=0) for (e in this) if (i++ >= beg) act(e)
}    // sample function I am testing; please don't change this!

fun main(a:Array<String>) {
  val l = listOf("zero", "one", "two", "three", "four")
  fun test() = buildSequence { l.forEachFrom(2) { yield(it) } }.joinToString("-")
  println(test())
}
Run Code Online (Sandbox Code Playgroud)

我想封装我的test(),所以它被称为: test(l.forEachFrom(2)) 但是,我似乎无法正确获取类型/语法。 我将如何重写test()函数定义以使其成为可能?

Ste*_*wes 0

目前尚不完全清楚您想要实现什么目标。如果您提供更多详细信息,我们可以提供更好的答案。也就是说,下面的代码有望为您指明正确的方向。

import kotlin.coroutines.experimental.*

inline fun <T,S> Iterable<T>.mapFrom(beg:Int, act:(T)->S) =
    drop(beg).map {act(it)}

fun main(a:Array<String>) {
    val l = listOf("zero", "one", "two", "three", "four")
    fun <T> test(values: List<T>) = values.joinToString("-")
    println(test(l.mapFrom(2) {it}))
}
Run Code Online (Sandbox Code Playgroud)

forEachFrom并不是真正被用作 a forEach,而是用作map。这是主要问题,因为您用来yield输出结果而不是仅仅返回结果。如果forEachFrom它也将被用于其副作用,它仍然可以用于该目的。

此外,没有理由test将函数作为参数而不只是接受该函数的输出作为其参数。该buildSequence调用也是多余的,因为您立即调用joinToString它是终端并强制对内部函数进行急切的计算buildSequence