請注意:由「純」的功能,我的意思並不是「純虛」
我指的是this純函數可以讀取全局狀態嗎?
如果一個功能「讀」一些全局狀態,並自動使其不純?還是取決於其他因素?
如果它自動呈現不純,請解釋原因。
如果它取決於其他因素,請解釋它們是什麼。
請注意:由「純」的功能,我的意思並不是「純虛」
我指的是this純函數可以讀取全局狀態嗎?
如果一個功能「讀」一些全局狀態,並自動使其不純?還是取決於其他因素?
如果它自動呈現不純,請解釋原因。
如果它取決於其他因素,請解釋它們是什麼。
「純」功能是一個函數,其輸入參數取決於只有。如果它讀取其他任何東西,它不是一個純函數。
需要純函數來構造純表達式。常量表達式根據定義是純粹的。
所以,如果你的全局「狀態」沒有改變,你很好。
一個更微妙的例子是,使用全局變量(或動態範圍的變量,或詞彙閉合),以幫助它計算其結果的功能的。由於該變量不作爲參數傳遞,但可以更改,即使參數相同,隨後調用該函數的結果也可能不同。 (在純函數編程的,破壞性的分配是不允許的,因此,使用全局(或動態作用域)的變量的函數仍然是引用透明,因爲這些變量不能改變。)
在某些專門實例中,肯定的。例如,如果您的全局緩存已經計算過的值只能由您的函數讀取和寫入,它仍然是數學上純的,因爲輸出僅依賴於輸入,但它不會是純粹的在最嚴格的意義上說。例如:
static int cache[256] = {0};
int compute_something(uint8_t input)
{
if(cache[input] == 0)
cache[input] = (perform expensive computation on input that won't return 0);
return cache[input];
}
在這種情況下,只要沒有其它功能倒是全球cache
,它仍然是一個純粹的數學函數,即使它在技術上依賴於外部的全局狀態。然而,這種狀態只是一個性能優化 - 它仍然會在沒有它的情況下執行相同的計算,只是速度更慢。
恩,難道你不能從這樣的功能中獲得「相同的輸入,不同的輸出」。比如位翻轉,它讀取一個布爾值緩存並返回與之相反的內容,並同時翻轉它。然後,當函數以相同的「輸入」運行時,它將得到不同的輸出(取決於函數的過去使用情況)。該功能不可能是純粹的。 – 2011-07-24 07:54:07
例如,在Haskell中,您可以在不純的一面創建一個隨機數的無限列表,並將該列表傳遞給您的純函數。該實現將生成純函數僅在需要時使用的下一個數字,但該函數仍然是純粹的。
爲什麼投票表決? – hasen 2009-03-04 06:05:30