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
相關文章
相關標籤/搜索