偏应用函数.是一种表达式,你不需要提供函数需要的所有参数。代之以仅提供部分,或不提供所需参数
。
def sum(a:Int,b:Int,c:Int)=a+b+c
val a=sum _
a(1,2,3)
scala编译器以偏应用表达式,sum _,实例化一个带三个缺失整数参数的函数值,并把这个新的函数值的索引赋给变量a.当把这个新函数值应用于三个参数之上时,它就回头调用sum,并传入这三个参数:1、2、3.
实际发生的事情是这样的:名为a的变量指向一个函数值对象。这个函数值是由scala编译器依照偏应用函数表达式sum _,自动产生的类的一个实例。编译器产生的类有一个apply方法带有三个参数.scala编译器把表达式a(1,2,3)翻译成对函数值的apply方法的调用。因此a(1,2,3)是 a.apply(1,2.3) 的短格式。
scala编译器根据表达式 sum _ 自动产生的类里的apply方法,简单地把这三个缺失的参数前转到sum,并返回计算结果。
这种一个下划线代表全部参数列表的表达式的另一个用途,就是把它当作转换函数(def)为函数值的方式。尽管不能把方法或嵌套函数通过赋值给变量,或当作参数传递给其他方法,但是如果你把方法或嵌套函数通过在名称后加一个下划线的方式包装在函数值中,就可以做到了。
下划线代表部分参数:
val b=sum(1,_:Int,3)
b(2)
如果你正在写一个省略所有参数的偏应用程序表达式,如println _ 或 sum _,而且在代码的那个地方正需要一个函数,你可以去掉下划线从而表达得更简明。
val someNumbers=List(-11,-10,4,12,4)
someNumbers.foreach(println _)
//可以简写成
someNumbers.foreach(println)
注:上述东西是从scala向导摘录来的(感谢scala圈子里的大虾)。
分享到:
相关推荐
书中会详细介绍如何定义和使用高阶函数,以及如何通过柯里化(Currying)和部分应用(Partially Applied Function)来构造更灵活的函数。 其次,函数式编程中的纯函数(Pure Function)是无副作用的,输入与输出...
柯里化的本质是部分应用(Partially Applied Function),即将函数的部分参数提前应用,得到一个新的只差剩余参数的函数。这样可以简化复杂函数的调用,提高代码的可读性和复用性。 在`main.js`中,我们可以预期...
咖喱化,或称为部分应用(Partially Applied Function),是函数式编程中的一个重要特性,尤其在JavaScript这样的语言中,它可以将接受多个参数的函数转换为一系列只接受一个参数的函数。这样做的好处是可以提前固定...
1. **Partially Applied Functions**:在Python中,部分应用(Partial Application)是一种常见的函数组合技术,它可以提前固定函数的一部分参数,从而创建新的函数。`jaraco.functools`提供了一种更灵活的方式来...
Scala 中,可以使用部分应用函数(Partially Applied Function)来实现柯里化,提高代码的灵活性和复用性。 5. **递归**: 递归是函数式编程中的基础概念,它允许函数调用自身。Scala 支持尾递归优化,当递归调用...
这使得部分应用(Partially Applied Function)成为可能,增加了代码的灵活性。 9. Pointfree风格 Pointfree风格是Haskell中一种编写函数的风格,不直接引用函数的参数,而是通过函数组合来表达。例如,`f . g` ...
这对于部分应用(Partially Applied Function)非常有用: ```javascript function greet(name, greeting) { console.log(greeting + ', ' + name); } let sayHelloToAlice = greet.bind(null, 'Alice', '...