把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数并且返回结果的新函数的技术。函数
简单的实现以下:ui
scala> def add(x:Int, y:Int) = x + y add: (x: Int, y: Int)Int
假如咱们应用的时候,是这样的:add(1,2)es5
柯里化函数:spa
scala> def add(x:Int)(y:Int) = x + y
Curry化最大的意义在于把多个参数的function等价转化成多个单参数function的级联,这样全部的函数就都统一了,方便作lambda演算。 在scala里,curry化对类型推演也有帮助,scala的类型推演是局部的,在同一个参数列表中后面的参数不能借助前面的参数类型进行推演,curry化之后,放在两个参数列表里,后面一个参数列表里的参数能够借助前面一个参数列表里的参数类型进行推演。这就是为何 foldLeft这种函数的定义都是curry的形式。scala
以下是本人查阅资料所了解到Scala语言柯里化函数的四种写法:code
不显示声明返回类型,Scala会自动推断出返回类型:blog
scala> def currying_1(x:Int) = { | y:String => y * x | }
currying_1: (x: Int)String => String // =>符号意味着返回的是一个函数
调用方式:token
scala> currying_1(3)("scalA") res0: String = scalAscalAscalA
显式声明返回类型——函数:io
scala> def currying_2(x:Int): String => String = { | y => y * x | }
currying_2: (x: Int)String => String // =>符号左边的String对应的是y,=>符号右边的String就对应着y * x
调用方式:function
scala> type curry_2(3) //验证返回类型,确实是个函数
res5: String => String = <function1>
不显示声明返回类型,Scala会自动推断出返回类型:
scala> def currying_3(x:Int)(y:String) = { | y * x | }
currying_3: (x: Int)(y: String)String
调用方式:
scala> currying_3(3)("ScalA") res1: String = ScalAScalAScalA
显式声明返回类型:
scala> def currying_4(x:Int)(y:String): String = { | y * x | } currying_4: (x: Int)(y: String)String
调用方式:
scala> currying_4(3)("ScalaA") res2: String = ScalaAScalaAScalaA