2017-04-23 76 views
2

如果我有一個函數:F#純函數和柯里

let f (myClass : MyClass) x = 
    // do something using the instance of myClass and x 

我咖喱˚F這樣的:

let myClass = new MyClass() 
let g = f myClass 

這樣我就可以叫

let something = f 42 

是GA純功能?還是它被捕獲的引用MyClass的實例使其不純?

回答

2

它取決於函數調用哪些函數(或方法),以及這些函數(或方法)是否純粹。捕獲的對象是完全不相關的。如果滿足兩個條件,則函數被認爲是「純」的:(1)在給定相同參數的情況下它總是返回相同的結果,(2)不產生任何副作用(包括輸入/​​輸出或變異數據)。函數是否有封閉捕獲的數據與純度概念無關。

例如,下列功能將是純的,即使它捕獲對象中的封閉:

let f (c: MyClass) x = if c = null then x else x+1 
let g = f (MyClass()) 

但以下功能不純,即使它不捕獲任何數據:

let g1 x = printfn "%d" x 
let g2 x = System.DateTime.Now.Minute + x 

在這個例子中,g1是不純的,因爲它以輸出形式產生副作用給控制檯;和g2是不純的,因爲它每次調用時都會返回不同的結果。

純度定義(也稱爲「參考透明度」)的原始思想是,程序中純函數的調用可以用其結果替換,而不會提醒程序的含義。這反過來對各種優化和證明都有用。

例如,g任何調用(如上所定義)可以安全地與它的結果所取代(例如替換g 56),但的g1調用不能,因爲這將改變該程序的控制檯輸出。