当前位置: 首页 > 知识库问答 >
问题:

部分函数在Kotlin中的应用

通安宁
2023-03-14
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())
}

我想封装我的test(),因此它被称为:test(L.ForeachFrom(2))。但是,我似乎无法正确获取类型/语法。我如何重新编写test()函数定义以实现这一目标?

共有1个答案

曹建华
2023-03-14

还不完全清楚你想要达到什么目的。如果你提供更多的细节,我们可以提供一个更好的答案。尽管如此,下面的代码希望能为您指明正确的方向。

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

foreachFrom实际上并不是用作foreach,而是用作map。这是主要问题,因为您使用yield输出结果,而不是仅仅返回结果。如果foreachfrom也将用于其副作用,那么它仍然可以用于此目的。

此外,test没有理由将函数作为参数,而不是仅仅接受该函数的输出作为其参数。buildsequence调用也是多余的,因为您会立即调用jointoString,它是终端,并强制对buildsequence中的函数进行快速计算。

 类似资料:
  • 问题内容: 我想使用Java 8的新引入的函数对象将一些参数部分地应用于传统方法。 这是有问题的方法: 问题答案: 这实现了我想做的事情: 有关Java函数对象的所有预定义变体的列表,请在此处查看。 编辑: 如果您的方法带有很多参数,则可以编写自己的函数: 方法接受很多参数;您想提供其中一些: 这是使用自定义函数对象的方式:

  • 我想出了这两个: 我的例子正确地说明了这个练习吗? 给定两个参数: null null 我在SO上看到了一些类似的问题(比如,这个问题),这个问题几乎是我要找的,但不完全是(我只是在找函数的例子,没有别的--没有应用性,没有单子)。

  • 上一章重点在于代码重复:提升现有的函数功能、或者将函数进行组合。 这一章,我们来看看另外两种函数重用的机制:函数的部分应用(Partial Application of Functions) 、 柯里化(Currying) 。 部分应用的函数 和其他遵循函数式编程范式的语言一样,Scala 允许部分应用一个函数。 调用一个函数时,不是把函数需要的所有参数都传递给它,而是仅仅传递一部分,其他参数留空

  • 本文向大家介绍C#函数式编程中的部分应用详解,包括了C#函数式编程中的部分应用详解的使用技巧和注意事项,需要的朋友参考一下 何谓函数式编程 相信大家在实际的开发中,很多情况下完成一个功能都需要借助多个类,那么我们这里的基本单元就是类。而函数式编程则更加细化,致使我们解决一个功能的基本单元是函数,而不是类,每个功能都是由多个函数构成,并且函数之间没有直接的关系。如果简单的文字描述还不足以让你理解,下

  • 这是我在编写java时从未考虑过的,因为我使用这个模式时没有任何问题: 这样做效果很好,因为重写的函数不依赖于任何未初始化的数据,但是它们对于每个派生的都是唯一的(因此需要抽象)。这在科特林也有效,但它仍然给出了警告。 那么在Java/Kotlin中这种做法是不是很糟糕呢?如果有,我该如何改进?是否可以在kotlin中实现而不被警告在构造函数中使用非final函数? 一个可能的解决方案是将行移动到

  • 从Kotlin调用Java代码时,存在SAM转换,因此Java代码如下所示: 可以如下所示: 现在,我正在处理一个Kotlin项目,我想将功能接口定义为事件侦听器: 在SomeClass中,我有一个设置监听器的函数: 当我创建这个类的实例并尝试调用setter函数时,我是这样做的: 我知道静态编程语言有函数类型,因此不支持来自各种站点的SAM转换,例如这个站点。 我读过一些关于函数类型的书,但我以