在Scala中使用Currying:多个参数列表与返回一个函数

埃里克·卡普伦

使用以下语法定义启用了curring的函数时:

def sum(x: Int)(y: Int)(z: Int) = x + y + z

一个仍然需要后缀来的咖喱呼叫任何电话sum_

sum _
sum(3) _
sum(3)(2) _

否则编译器会抱怨。

所以我诉诸:

val sum = (x: Int) => (y: Int) => (z: Int) => x + y + z

没有的作品_

现在的问题是:为什么需要多参数列表版本_才能吸引用户加入?为什么这两个版本的语义在所有情况下都不相同?

另外,是否以某种方式不鼓励使用后者?是否有任何警告?

加布里埃·彼得罗内拉

这两种语义不同的原因是方法和功能不是同一件事。

方法是全fledges JVM方法,而函数值(即像类实例Function1Function2等等)。

所以

def sum(x: Int)(y: Int)(z: Int) = x + y + z

val sum = (x: Int) => (y: Int) => (z: Int) => x + y + z

可能看起来一样,但是第一个是方法,第二个是方法 Function1[Int, Function1[Int, Function1[Int, Int]]]

当您尝试使用需要函数值的方法时,编译器会自动将其转换为函数(称为eta-expansion的过程)。

但是,在某些情况下,编译器不会自动对方法进行eta扩展,例如您公开的情况,其中您明确希望部分应用它。

使用_触发eta扩展,因此将方法转换为函数,并且每个人都很高兴。

根据scala规范,您还可以注释期望的类型,在这种情况下,扩展将自动执行:

def sum(x: Int)(y: Int)(z: Int) = x + y + z
val sumFunction: Int => Int => Int => Int = sum

这就是为什么相同的原因

def sum(x: Int, y: Int) = x + y
List(1,2,3).reduce(sum)

有效,即我们传递了一个显式需要函数的方法。

这是关于Scala何时执行eta扩展的更深入讨论:https : //stackoverflow.com/a/2394063/846273


关于采用哪种选择,我将为您指出这个答案该答案非常详尽。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数式编程:返回使用特定参数调用不同函数列表的第一个真实结果

来自分类Dev

Golang:在函数中使用一个值返回多个参数

来自分类Dev

带有一个参数的python 3函数返回整数列表

来自分类Dev

使用参数列表调用另一个函数的函数不起作用

来自分类Dev

在Scala中使用Currying:函数中的多个参数,包括类型为(=> A)的匿名函数

来自分类Dev

在Scala中使用Currying:函数中的多个参数,包括类型为(=> A)的匿名函数

来自分类Dev

返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?

来自分类Dev

r:在函数中使用参数列表

来自分类Dev

为什么Scala无法为具有多个参数列表的函数推断通用返回类型?

来自分类Dev

如何在r中使用带有多个参数的函数列表的应用函数?

来自分类Dev

如何编写一个基于输入返回“n”个函数列表的函数

来自分类Dev

如何从异步函数返回多个值以在另一个函数中使用

来自分类Dev

Swift:返回一个递归函数(currying)

来自分类Dev

在c++中使用一个函数的返回值作为另一个函数的参数

来自分类Dev

C ++函数调用缺少参数列表;使用'&Runner :: runTask'创建一个指向成员的指针

来自分类Dev

如何创建一个C ++宏来定义使用调用另一个函数的参数列表的函数?

来自分类Dev

currying和多个参数列表有什么区别?

来自分类Dev

汇总一个在列表中返回多个值的函数

来自分类Dev

创建一个从类返回参数列表(常量字符串)的方法

来自分类Dev

Python3-仅接受一个参数并使用递归返回列表的函数

来自分类Dev

如何仅使用一个参考参数使用可变长度参数列表?

来自分类Dev

Haskell 在一个函数中使用多个函数

来自分类Dev

错误:一个以上的重载函数实例与参数列表匹配

来自分类Dev

函数组合导致方法第一个缺少参数列表

来自分类Dev

缺少 ) 参数列表后就在我调用一个函数时

来自分类Dev

想要一个从我的函数返回的质数列表但只获得第一个值?

来自分类Dev

从函数列表的方式创建一个新列表

来自分类Dev

Haskell-将任意函数和参数列表作为参数传递给另一个函数

来自分类Dev

在ramda中使用相同的参数调用函数列表

Related 相关文章

  1. 1

    函数式编程:返回使用特定参数调用不同函数列表的第一个真实结果

  2. 2

    Golang:在函数中使用一个值返回多个参数

  3. 3

    带有一个参数的python 3函数返回整数列表

  4. 4

    使用参数列表调用另一个函数的函数不起作用

  5. 5

    在Scala中使用Currying:函数中的多个参数,包括类型为(=> A)的匿名函数

  6. 6

    在Scala中使用Currying:函数中的多个参数,包括类型为(=> A)的匿名函数

  7. 7

    返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?

  8. 8

    r:在函数中使用参数列表

  9. 9

    为什么Scala无法为具有多个参数列表的函数推断通用返回类型?

  10. 10

    如何在r中使用带有多个参数的函数列表的应用函数?

  11. 11

    如何编写一个基于输入返回“n”个函数列表的函数

  12. 12

    如何从异步函数返回多个值以在另一个函数中使用

  13. 13

    Swift:返回一个递归函数(currying)

  14. 14

    在c++中使用一个函数的返回值作为另一个函数的参数

  15. 15

    C ++函数调用缺少参数列表;使用'&Runner :: runTask'创建一个指向成员的指针

  16. 16

    如何创建一个C ++宏来定义使用调用另一个函数的参数列表的函数?

  17. 17

    currying和多个参数列表有什么区别?

  18. 18

    汇总一个在列表中返回多个值的函数

  19. 19

    创建一个从类返回参数列表(常量字符串)的方法

  20. 20

    Python3-仅接受一个参数并使用递归返回列表的函数

  21. 21

    如何仅使用一个参考参数使用可变长度参数列表?

  22. 22

    Haskell 在一个函数中使用多个函数

  23. 23

    错误:一个以上的重载函数实例与参数列表匹配

  24. 24

    函数组合导致方法第一个缺少参数列表

  25. 25

    缺少 ) 参数列表后就在我调用一个函数时

  26. 26

    想要一个从我的函数返回的质数列表但只获得第一个值?

  27. 27

    从函数列表的方式创建一个新列表

  28. 28

    Haskell-将任意函数和参数列表作为参数传递给另一个函数

  29. 29

    在ramda中使用相同的参数调用函数列表

热门标签

归档