2009-08-19 34 views
4

我在閱讀PrototypeJS的文檔時遇到了這個問題:Identity Function。我做了一些進一步的搜索&閱讀它,我想我理解它的數學基礎(例如乘以1是一個身份函數(或者我誤解了這個?)),但不是爲什麼你會寫一個JS(或PHP或C或其他) - 功能,基本上把X作爲參數,然後只是做一些像return X'身份函數'的目的是什麼?

有沒有更深的見解與此相關? Prototype爲什麼提供這個功能?我能用它做什麼?

謝謝:)

回答

7

使用標識功能使庫代碼稍微容易閱讀。就拿Enumerable#any方法:

any: function(iterator, context) { 
    iterator = iterator || Prototype.K; 
    var result = false; 
    this.each(function(value, index) { 
     if (result = !!iterator.call(context, value, index)) 
     throw $break; 
    }); 
    return result; 
    }, 

它可以讓你檢查是否有一個數組的元素在布爾環境都是如此。像這樣:

$A([true, false, true]).any() == true 

,但它也可以讓你真正的檢查之前處理每一個元素:

$A([1,2,3,4]).any(function(e) { return e > 2; }) == true 

現在沒有你必須編寫的任何函數的兩個版本的標識功能,一個如果你預處理,如果你不處理。

any_no_process: function(iterator, context) { 
    var result = false; 
    this.each(function(value, index) { 
     if (value) 
     throw $break; 
    }); 
    return result; 
    }, 

    any_process: function(iterator, context) { 
    return this.map(iterator).any(); 
    }, 
0

我不知道該庫,但通常情況下,你通過分解共用部分進行,如if (add) (a + b) + x else a + b應該被改寫成a + b + (add ? x : 0)優化formuals或代碼或什麼的。你很想和

if (!initialized) initialize(callback_with_very_long_name) else callback_with_very_long_name 

看起來很相似。你可以很容易地分解出一個共同的因素或術語,但我們如何分解出一個功能應用程序呢?如果你瞭解mathematiscs或Hascel,你應該看到

a ? x + v : v 

看起來非常像

a ? f value : value 

你在一個案例中添加X,但不是在其他。您在一個案例中應用功能,但在另一個案例中不應用。您將前者優化爲(a ? x : 0) + v,因爲0是additive identity(它在添加到它時不會改變任何內容)並且v是一個常見因素,無論application of x如何,它始終是一個常見因素。在功能應用(或不應用)的情況下,回調是共同的因素。我們想把它分解出來。什麼是我們應該適用的身份功能,以便沒有任何變化?身份功能!

(a ? f : identity) value 

是我們正在尋找。我們的原始示例如下所示

(initialized ? identity : initialize) (callback_with_very_long_name) 

請注意,它現在可以放入一行頁。

相關問題