gpt4 book ai didi

scala - 无限可 curry 添加功能

转载 作者:行者123 更新时间:2023-12-04 22:39:24 24 4
gpt4 key购买 nike

我想知道如何实现一个无限柯里化(Currying)添加函数,为了解释我会坚持使用 scala。

我知道如何准备一个简单的 curry 像

def add(a: Int): Int => Int = {
def iadd(b: Int): Int = {
a + b
}
iadd
}
add(4)(5) // 9

我将如何实现 add(5)(4)(x1)(x2)..(xn)

最佳答案

聪明的方式

问题是评论是恰当的:你什么时候停止柯里化(Currying)并产生结果?

一种解决方案是通过使用零参数调用函数来停止递归。 Scala 的重载让我们这样做。

add(1)(2)(3)(4)() // The () indicates that we're done currying

这是相对简单的。我们只需要一个带有 apply 的类返回自身的一个新实例
// A class with an apply method is callable like a function
class Adder(val acc: Int) {

def apply(a: Int): Adder =
new Adder(acc + a)

def apply(): Int =
acc

}

def add: Adder = new Adder(0)

println(add(1)(2)(3)(4)()) // 10

如果您有真正的理由这样做,这将是我推荐的方式。它简单易读,并且在柯里化(Currying)之上添加了非常少的样板。

有点精神错乱的方式

但是有什么乐趣是简单而合乎逻辑的呢?让我们去掉最后那些愚蠢的括号,嗯?我们可以使用 Scala 的隐式转换来做到这一点。首先,我们需要导入这个特性,这样 Scala 就不会再警告我们我们正在做的事情是愚蠢的而不是一个好主意。
import scala.language.implicitConversions

然后我们让它 Adder可以转换为 Int
// Don't do this in real code
implicit def adderToInt(adder: Adder): Int =
adder()

现在,我们最后不需要那些括号。然而,我们确实需要向类型系统表明我们想要一个 Int。 .
val result: Int = add(1)(2)(3)(4)
println(result) // 10

将结果传递给接受 Int 的函数,例如,也足够了。

评论

由于您通常提到函数式编程,我会注意到您可以使用类型类在 Haskell 中执行类似的技巧。您可以通过 Text.PrintF 在标准库中看到这一点。 .请注意,由于 Haskell 函数总是采用一个参数,因此您需要有一个标记值来指示参数的“结束”( () 可能就足够了,这取决于您的参数类型的通用性)。

关于scala - 无限可 curry 添加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57083636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com