2009-08-19 8 views
4

PrototypeJSの文書である「Identity Function」を読んでいたとき、私はこの問題に遭遇しました。私はそれ以上の検索をしました&それを読んで、私はその数学的な基礎を理解していると思う(例えば、1の乗算はアイデンティティ関数ですか(または私はこれを間違って解釈しましたか))、なぜ JS 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 

が、それはまた、あなたが真をチェックする前に各要素を処理することができます、あなたが任意の関数の2つのバージョンを記述する必要がありますアイデンティティ機能なし

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

1あなたが前処理していれば、そしてもしあなたがいなければ、一つ。

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 + ba + 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 

ようになっていることをあなたは1ケースでのxを追加ではなく、他のインチあるケースでは関数を適用しますが、他のケースでは適用しません。 0がadditive identity(追加されても何も変更されません)で(a ? x : 0) + vに前者を最適化し、に関係なく、常にvが共通の要素です。機能アプリケーション(またはアプリケーションではない)の場合、コールバックは共通の要素です。私たちはそれを取り除きたい。何も変わらないように私たちがそれに適用すべきアイデンティティ関数は何ですか?アイデンティティ関数!

(a ? f : identity) value 

は、私たちが探しているものです。元の例は次のようになります

(initialized ? identity : initialize) (callback_with_very_long_name) 

ページの1行に収まることに注意してください。