code

2016年10月22日 星期六

Scala 筆記 7 - Currying

如何理解

Currying原本是把多參數function分拆成多個單一參數function的方法。

原本的sum可能是長這樣:

//原本的多參數function
def add(a:Int, b:Int, c:Int) : Int = a+b+c

type是 (val a: Int,val b: Int,val c: Int) => Int


//curried version
def curriedAdd (a:Int) =
  (b:Int) =>
    (c:Int) => a+b+c

type是 (val a: Int) => (Int => (Int => Int))


不過Scala也可以寫成這樣currying:

//another curried add
def curriedAdd2 (a:Int)(b:Int)(c:Int) = a+b+c

但是這個type為 (val a: Int)(val b: Int)(val c: Int) => Int
所以在呼叫的時候必須要告知compiler你是選擇性傳入前面的參數,而不是忘記!用underscore符號來表示:

curriedAdd2(5) _

通式


一個原本是多參數的function f(args1, args2, .... , argsn),其curried function為:


對第n個argument來說,其定義相當於前面有n-1次的partial application (部分formal parameters被input arguments取代),最後結果為接受argsn參數的function g:


每一次的return type都是一個function,直到最後一次才是最終的type:



Currying的好處

老實講還不明朗,有機會再來補充。

沒有留言:

張貼留言