Scala函数柯里化(Currying or Curry)

柯里化(Currying)  

  把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数并且返回结果的新函数的技术。函数

  简单的实现以下: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
相关文章
相关标签/搜索