1

アップデート

これらの関数の効果の 1 つは、通常はサポートされないメソッドでメソッド チェーンを使用する方法を提供することであるため*chain 、それぞれおよびを呼び出すことを検討していcopychainます。copychainただし、少なくとも関数型プログラミングに関しては、自称は間違いなくより基本的な概念であるため、これは理想的とは言えません。


オリジナル

とりあえず~と呼んでいboxerます。問題は一般的ですが、コードはPythonです。

def boxer(f):
    """Return a function g(o, *args, **keyargs) -> o

    `g` calls `f` on `o` with the remaining arguments
        and returns `o`.

    >>> l = [2]
    >>> def increment_list_element(l, i):
    ...     l[0] += i
    >>> adder = boxer(increment_list_element)
    >>> adder(l, 2)
    [4]
    >>> def multiply_list_element(l, i):
    ...     l[0] *= i
    >>> multiplier = boxer(multiply_list_element)
    >>> sum(multiplier(l, 6))
    24
    """
    def box(o, *args, **keyargs):
        f(o, *args, **keyargs)
        return o
    return box

同様の概念は、予定の譲受人をコピーし、そのコピーを割り当てて返します。これは " shadow_boxer" です:

from copy import deepcopy

def shadow_boxer(f):
    """Return a function g(o, *args, **keyargs) -> p

    `g` deepcopies `o` as `p`,
        executes `f` on `p` with the remaining arguments,
        and returns `p`.

    >>> l = [2]
    >>> def increment_list_element(l, i):
    ...     l[0] += i
    >>> adder = shadow_boxer(increment_list_element)
    >>> adder(l, 2)
    [4]
    >>> def multiply_list_element(l, i):
    ...     l[0] *= i
    >>> multiplier = shadow_boxer(multiply_list_element)
    >>> sum(multiplier(l, 6))
    12
    """
    def shadow_box(o, *args, **keyargs):
        p = deepcopy(o)
        f(p, *args, **keyargs)
        return p
    return shadow_box

さらに、この種のことについてもっと学ぶためのリソースについて知りたいのですが、「これらの種類のもの」の名前も同様にわかりません. 関数型プログラミングに関連しているように見えますが、私が理解しているように、これらの手法は真の関数型言語では不要です。

4

2 に答える 2

2

これは Ruby のObject#tap. 名前についてどう思うかわかりませんが、彼らはそう呼んでいます。

于 2010-10-08T22:01:28.887 に答える
0

boxer関数が返すものは、おそらくいくつかのプログラミング言語で定義されたクロージャです。この名前の関数がまだない場合は、その関数を呼び出しますclosure

于 2010-06-24T13:14:19.740 に答える