2

f: (a, b, c = 5, d = 0) -> {...}2 ~ 4 個の引数を取る関数があります。

最後の引数には常にデフォルトを使用し、最初の 2 つの引数には特定の値 (1 と 2 など) を使用する、この関数の「バインドされた」バージョンを渡したいと考えています。つまり、欲しいg: () -> f(1, 2)

部分適用を行うと、 が得られg': (c = 5, d = 0) -> f(1, 2, c, d)ます。つまり、部分的な適用は、g私が望むゼロ引数の性質を強制せず、代わりにg'、0 から 2 の引数を取るものを与えます。

もしあれば、呼ばれたgから取得するためのテクニックは何ですか?f

4

1 に答える 1

2

私のコメントを回答として投稿する: この質問は、関数型プログラミング、カリー化、または部分的なアプリケーションとはほとんど関係がないようですが、代わりに、デフォルトを持つオプションの引数を取る関数を取得し、オプションの引数を持たない新しい関数を作成することに関するものです。デフォルトの引数が修正されました。

これを概念変換と呼びTます。何らかの理由で、部分的な適用がオプションの引数がオプションのままであることを意味すると仮定すると (これは普遍的である必要はありませんが、よく知られている関数型プログラミング言語 (Haskell など) にオプションの引数さえありません)、少なくとも 2 つの方法があります。から取得gfます。

    • Take f: (a, b, c = 5, d = 0) -> {....}which は 2 ~ 4 個の引数を取ります。
    • T(f) : (a,b) -> {...}ちょうど 2 つの引数を取る新しい関数を生成します。つまり、T(f)(a,b) = f(a,b) = f(a,b,5,0).
    • ここで、2 つの引数を 1 と 2 に固定して T(f) に部分適用を行い、結果の関数 を呼び出しますg。つまり、g() = T(f)(1,2) = f(1,2) = f(1,2,5,0).

    • Take f: (a, b, c = 5, d = 0) -> {....}which は 2 ~ 4 個の引数を取ります。
    • f最初の 2 つの引数を 1 と 2に固定して部分適用を行い、結果の関数を呼び出しますg'。つまり、g' : (c=5, d=0) -> f(1, 2, c, d). 引数は 0 ~ 2 個です。
    • T(g) : () -> {....}正確に 0 個の引数を取る新しい関数を生成します。つまり、T(g)() = g'() = g'(5, 0) = f(1, 2, 5, 0).

いずれにせよ、問題の困惑は、T関数型プログラミング、カリー化、または部分的なアプリケーションの側面ではなく、 にかかっているようです。標準的な名前を付けるのに十分なポイントがあるかどうかはわかりませんがT、「デフォルト引数の固定/バインディング」のようなもので問題ありません。

于 2011-06-03T10:22:24.063 に答える