【问题标题】:Function currying in scalascala中的函数柯里化
【发布时间】:2020-06-19 03:07:49
【问题描述】:

我正在学习 scala 并阅读了这个名为“currying”的概念。我知道它是用来划分函数中的参数并一一传递的。因此,据我了解,我尝试在下面创建一个简单的基本柯里化函数:

def add_num(a:Int,b:Int)(c:Int):Int={a+b+c}
add_num(10,20)
add_num(10)

但是当我用值 10 和 20 调用函数时,它给了我一个错误。我的理解是它会记住这些值,然后我可以将第三个值分别作为 10 传递。我无法理解这个概念。有人可以帮助我从最基本的术语中理解这个概念。

错误是缺少方法 add_num 的参数列表。未提供的方法仅在执行函数类型时转换为函数。

【问题讨论】:

  • 这能回答你的问题吗? Curried function in scala
  • 试试val almost = add_num(10,20) _,然后是almost(7)
  • 我试过这个 val f = add_num(10,20)(_) f(10),结果是 40。但我不明白为什么我必须使用占位符然后传递它的值,如果我仍然必须这样使用它,那么柯里化有什么好处。
  • 好处是您现在将部分应用的函数作为变量中的一个单独对象提供给不需要了解前两个参数的应用程序的其他部分。考虑您的函数调用 API。应用程序中设置凭据的部分可以使用一个函数来传递 API 访问密钥。应用程序的其余部分就不再需要关心这些了。
  • @VyomVerma 柯里化的重点不是一次应用所有参数,而是能够将almost 传递到程序中的其他地方,如Thilo 所说。如果你想一次给出所有参数,你仍然可以使用add_num(10,20)(7)!

标签: scala


【解决方案1】:

一个柯里化函数应用于多个参数列表,而不仅仅是 一。一个非柯里化函数的例子,它添加了两个Int参数,xy

scala> def plainOldSum(x: Int, y: Int) = x + y
plainOldSum: (x: Int, y: Int)Int
scala> plainOldSum(1, 2)
res4: Int = 3

一个类似的柯里化函数:

scala> def curriedSum(x: Int)(y: Int) = x + y
curriedSum: (x: Int)(y: Int)Int
scala> curriedSum(1)(2)
res5: Int = 3

这里发生的是当你调用curriedSum时,你实际上 连续获得两个传统的函数调用。第一个功能 调用采用名为 x 的单个 Int 参数,并返回一个函数 第二个函数的值。第二个函数采用Int 参数 y

这是一个名为 first 的函数,它在精神上与第一个传统的 curriedSum 的函数调用会做:

scala> def first(x: Int) = (y: Int) => x + y
first: (x: Int)Int => Int

first 函数应用于1——换句话说,调用first 函数 并传入1——产生second函数:

scala> val second = first(1)
second: Int => Int = <function1>

second 函数应用于2 会产生结果:

scala> second(2)
res6: Int = 3

这些firstsecond 函数只是柯里化的一个说明 过程。它们不直接连接到curriedSum 函数。尽管如此, 有一种方法可以实际引用curriedSum 的“第二个” 功能。您可以使用占位符表示法在部分使用 curriedSum 应用函数表达式,像这样:

scala> val onePlus = curriedSum(1)_
onePlus: Int => Int = <function1>

curriedSum(1)_ 中的下划线是第二个参数的占位符 list.2 结果是对一个函数的引用,该函数在调用时会添加一个 到它唯一的Int 参数并返回结果:

scala> onePlus(2)
res7: Int = 3

下面是如何获得一个在其唯一的 Int 参数中添加两个的函数:

scala> val twoPlus = curriedSum(2)_
twoPlus: Int => Int = <function1>
scala> twoPlus(2)
res8: Int = 4

【讨论】:

  • 这是一个非常清晰的解释,也是一个非凡的第一篇文章。 Stack Overflow 社区很幸运有您作为贡献者。
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多