Scala函数柯里化(Currying or Curry)

Java基础

浏览数:142

2019-8-16

AD:资源代下载服务

柯里化(Currying)  

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

  简单的实现如下:

scala> def add(x:Int, y:Int) = x + y
add: (x: Int, y: Int)Int

  假如我们应用的时候,是这样的:add(1,2)

  柯里化函数

scala> def add(x:Int)(y:Int) = x + y

  Curry化最大的意义在于把多个参数的function等价转化成多个单参数function的级联,这样所有的函数就都统一了,方便做lambda演算。 在scala里,curry化对类型推演也有帮助,scala的类型推演是局部的,在同一个参数列表中后面的参数不能借助前面的参数类型进行推演,curry化以后,放在两个参数列表里,后面一个参数列表里的参数可以借助前面一个参数列表里的参数类型进行推演。这就是为什么 foldLeft这种函数的定义都是curry的形式。

  如下是本人查阅资料所了解到Scala语言柯里化函数的四种写法:

第一种写法:

  不显示声明返回类型,Scala会自动推断出返回类型:

scala> def currying_1(x:Int) = {
     |     y:String => y * x
     | }

currying_1: (x: Int)String => String // =>符号意味着返回的是一个函数

  调用方式:

scala> currying_1(3)("scalA")
res0: String = scalAscalAscalA

第二种写法:

  显式声明返回类型——函数:

scala> def currying_2(x:Int): String => String = {
     |     y => y * x
     | }
currying_2: (x: Int)String => String // =>符号左边的String对应的是y,=>符号右边的String就对应着y * x

   调用方式:

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

 

作者:buildings