3
class foo(object):
        def __init__(self,f):
                self.f = f
        def __call__(self,args_list):
                def wrapped_f(args_list):
                        return [self.f(*args) for args in args_list]
                return wrapped_f(args_list)

if __name__=='__main__':

        class abc(object):
                @foo
                def f(a,b,c):
                        return a+b+c

        a = range(5)
        b = range(5)
        c = range(5)
        data = list(zip(a,b,c))
        print(abc.f(data))

私はこれを数年前に書きました。f(X)関数を飾ると。@fooになり f(list of Xs)ます。

このプロセスは何と呼ばれていますか?それは何ですか?その関数型プログラミングの名前は何ですか?

カリー化していない。私は単純なmap9(f,list of Xs)ことがそれをすることができたかもしれないことを知っています。

数学的に呼ばれるデコレータ/デコレーションの操作とは何ですか?

4

4 に答える 4

2

デコレータには特別な構文がありますが、デコレータが返すことができるルールや数学的な説明はありません。結局のところ、それらは任意の呼び出し可能である可能性があります。

関数は部分的に適用されたスターマップです。

from functools import partial
from itertools import starmap

def foo(f):
    return partial(starmap, f)
于 2011-10-16T15:50:52.977 に答える
1

Haskell のような関数型言語mapでは、引数のタプルを受け取る関数に関数を部分的に適用することでこれを行い、引数のタプルのリストを受け取る関数を作成します。Jochen Ritzel が別の回答で指摘したように、Python でも を使用してこれをかなり簡単に実装できますfunctools.partial

ですから、この作業を「地図の部分適用」というか、そういうことだと思います。この特別なケースの特定の名前は知りません。

于 2011-10-17T03:07:07.370 に答える
0

それらは単にと呼ばれDecoratorsます。それが何をするかはまたはと呼ぶことができます、私はかなり周りを見回し、それらの2つ(連鎖/注釈)以外にこのプロセスの特別な機能的/数学的な名前を見つけませんでした。function chainingfunction annotation

PEPインデックス>PEP318-関数とメソッドのデコレータ

「デコレータ」という名前で

この機能の「デコレータ」という名前の選択については、多くの不満があります。主なものは、その名前がGoFブック[11]での使用と一致していないことです。「デコレータ」という名前は、おそらくコンパイラ領域での使用に由来しています。構文ツリーがウォークされ、注釈が付けられます。より良い名前が出てくる可能性は十分にあります。

于 2011-10-16T15:05:28.953 に答える