9

したがって、カリー化についての私の理解(SOの質問に基づく)は、関数のパラメーターを部分的に設定し、結果として「切り捨てられた」関数を返すことができるということです。

大きな毛むくじゃらの関数がある場合、10個のパラメーターを取り、次のようになります

function (location, type, gender, jumpShot%, SSN, vegetarian, salary) {
    //weird stuff
}

を除くすべてのプリセットを処理できる「サブセット」関数がjumpShot%必要な場合は、元の関数から継承するクラスを分割する必要がありますか?

私が探しているのは、このパターンのユースケースだと思います。ありがとう!

4

4 に答える 4

5

カレーには多くの用途があります。頻繁に使用する関数のデフォルト パラメータを指定するだけでなく、特定の目的に役立つ特殊な関数を返すこともできます。

しかし、次の例を挙げましょう。

function log_message(log_level, message){}
log_error = curry(log_message, ERROR)
log_warning = curry(log_message, WARNING)

log_message(WARNING, 'This would be a warning')
log_warning('This would also be a warning')
于 2010-04-27T23:24:00.950 に答える
1

javascript では、コールバック関数をカリー化します (呼び出し元から呼び出された後にパラメーターを渡すことができないため)。

次のようなものです:

...
var test = "something specifically set in this function";
onSuccess: this.returnCallback.curry(test).bind(this),

// This will fail (because this would pass the var and possibly change it should the function be run elsewhere
onSuccess: this.returnCallback.bind(this,test),
...

// this has 2 params, but in the ajax callback, only the 'ajaxResponse' is passed, so I have to use curry
returnCallback: function(thePassedVar, ajaxResponse){
   // now in here i can have 'thePassedVar', if 
}

それが十分に詳細であるか一貫性があるかはわかりません...しかし、基本的にカリー化により、パラメーターを「事前に入力」し、データが既に入力されている裸の関数呼び出しを返すことができます(別の時点でその情報を入力する必要はありません)

于 2010-04-27T23:23:56.220 に答える
1

関数型スタイルでプログラミングする場合、引数をバインドして、古い関数 (この例では述語) を新しい関数に生成することがよくあります。擬似コード:

filter(bind_second(greater_than, 5), some_list)

次と同等かもしれません:

filter({x : x > 5}, some_list)

{x : x > 5}無名関数の定義です。つまり、some_list5 より大きいすべての値のリストを作成します。

于 2010-04-28T00:28:34.123 に答える
0

多くの場合、省略されるパラメーターはコンパイル時ではなく、実行時に認識されます。さらに、特定の機能に存在する可能性のあるカレーデリゲートの数に制限はありません。以下は、実際のプログラムを基にしたものです。

コマンドパケットをリモートマシンに送信し、応答パケットを受信するシステムがあります。すべてのコマンドパケットにはインデックス番号があり、各応答には、応答の対象となるコマンドのインデックス番号が付いています。英語に翻訳された典型的なコマンドは、「アドレス0x12300から始まる128バイトをください」です。典型的な応答は「成功」です。128バイトのデータと一緒に。

通信を処理するために、それぞれがデリゲートを持つ多数のコマンドパケットを受け入れるルーチンがあります。各応答が受信されると、対応するデリゲートが受信したデータに対して実行されます。上記のコマンドに関連付けられているデリゲートは、「128バイトのデータで「成功」したことを確認し、成功した場合は、アドレス0x12300のバッファーに格納します」のようになります。複数のパケットが常に未処理である可能性があることに注意してください。カレーアドレスパラメータは、ルーチンが着信データの送信先を知るために必要です。アドレスパラメータを必要としない「データをバッファに保存する」ルーチンを作成したい場合でも、受信データの送信先を知る方法はありません。

于 2010-12-23T02:32:31.747 に答える