了解Scala中的部分应用函数

322 阅读2分钟

阅读时间: 3 分钟

Now Is The Time For You To Know The Truth About Partially-Applied Function And Currying in Scala

Scala中的模式匹配可以扩展到创建部分应用的函数,即一个不支持符合输入类型的每一个可能的值的单选函数。部分函数只针对某些领域的输入值。

部分应用函数

部分应用函数是指不应用于所述函数定义的所有参数的函数,即在调用一个函数时,我们可以提供一些参数,剩下的参数在需要时才提供。

  • 部分应用函数有助于将一个接受许多参数的函数最小化为一个只接受一些参数的函数。
  • 它可以取代一个函数所定义的任何数量的参数。
  • 对用户来说,利用这种方法比较容易。

语法。

val multiply = (a: Int, b: Int, c: Int) => a * b * c
// less arguments passed
val f = multiply(1, 2, _: Int)

正如我们在上面的语法中看到的,我们有一个正常的函数multiply,它有三个参数,我们传递较少的参数(两个),我们可以看到它没有抛出一个异常,这是一个部分应用的函数。

// Scala program of Partially
// applied functions
// Creating object
object Applied
{
	// Main method
	def main(args: Array[String])
	{
		// Creating a Partially applied
		// function
		def Book(discount: Double, costprice: Double)
		: Double =
		{
			(1 - discount/100) * costprice
		}
		// Applying only one argument
		val discountedPrice = Book(25, _: Double)
		// Displays discounted price
		// of the book
		println(discountedPrice(400))
	}
}

部分定义的函数

这是一个只对某些值起作用的单选函数。(单数意味着它只接受一个参数。)这个想法完美地映射到数学上的域的概念。例如,自然对数对于任何x < =0都没有定义。定义一个函数l,用case语句来限制它所接受的参数

Scala curry函数

通过Scala的curry函数,我们可以将一个有多个参数的列表分割成一连串的函数,每个都有一个参数。这意味着我们用一个以上的参数列表来定义它们。这是一个需要多个参数的函数,可以转化为一系列的函数调用,每一个都需要一个参数。

一个Scala Currying函数的语法。

我们使用下面的语法来进行currying:def multiply(a:Int)(b:Int)=a*b

def multiply(a:Int)(b:Int)=a*b

另一种方法是:def multiply(a:Int)=(b:Int)=>a*b

def multiply(a:Int)=(b:Int)=>a*b

例子 - 1

scala> class Add{
| def sum(a:Int)(b:Int)={
| a+b}
| }
defined class Add
scala> var a=new Add()
a: Add = Add@53cba89f
scala> a.sum(3)(4)
res4: Int = 7

Scala中卷曲函数的优点

  1. Scala currying的一个好处是,它使创建匿名函数变得更加容易。

  2. Scala Currying还使得将函数作为第一类对象进行传递变得更加容易。你可以在找到参数时继续应用它们。

结语

因此,利用部分函数的概念,我们在Scala中使用curry函数。这让我们可以将一个多参数的列表分割成一连串的函数。curry函数和部分应用函数的好处是能够在一般函数的基础上创建专门的函数,而不需要引入新的代码,保持代码的无重复性。