scala中有PartialFunction的概念, 同時還要一個概念叫Partial Applied Function. 前者譯作偏函數, 后者譯作"偏應用函數"或"部分應用函數", 一字之差, 差距很大.
首先偏函數是個數學概念, 偏函數不是"函數"的一種, 而是一個跟函數平行的概念. 定義可參考wiki http://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0 , 它是指定義域X中可能存在某些值在值域Y中沒有對應的值.
scala可以通過模式匹配來定義偏函數, 下面這兩種方式定義的函數, 都可以認為是偏函數, 因為他們都只對其定義域Int的部分值做了處理. 那么像p1哪有定義成PartialFunction的額外好處是, 你可以在調用前使用一個isDefinedAt方法, 來校驗參數是否會得到處理. 或者在調用時使用一個orElse方法, 該方法接受另一個偏函數,用來定義當參數未被偏函數捕獲時該怎么做. 也就是能夠進行顯示的聲明. 在實際代碼中最好使用PartialFunction來聲明你確實是要定義一個偏函數, 而不是漏掉了什么.
def p1:PartialFunction[Int, Int] = { case x if x > 1 => 1 } def p2 = (x:Int) => x match { case x if x > 1 => 1 }
而部分應用函數, 是指一個函數有N個參數, 而我們為其提供少於N個參數, 那就得到了一個部分應用函數.
比如我先定義一個函數
def sum(a:Int,b:Int,c:Int) = a + b + c;
那么就可以從這個函數衍生出一個偏函數是這樣的:
def p_sum = sum(1, _:Int, _:Int)
於是就可以這樣調用p_sum(2,3), 相當於調用sum(1,2,3) 得到的結果是6. 這里的兩個_分別對應函數sum對應位置的參數. 所以你也可以定義成
def p_sum = sum (_:Int, 1, _:Int)
這東西有啥用呢? 一個是當你在代碼中需要多次調用一個函數, 而其中的某個參數又總是一樣的時候, 使用這個可以使你少敲一些代碼. 另一個呢?