如何理解
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:
沒有留言:
張貼留言