scala解惑: 偏函數與部分應用函數


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) 

這東西有啥用呢? 一個是當你在代碼中需要多次調用一個函數, 而其中的某個參數又總是一樣的時候, 使用這個可以使你少敲一些代碼. 另一個呢? 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM