把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數的技術。函數
簡單的實現以下: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