在python中使用decorator将f(x)转换为f([x])

在python中使用decorator将f(x)转换为f([x]),python,functional-programming,decorator,lifting,Python,Functional Programming,Decorator,Lifting,这是我几年前写的。当你用@foo装饰任何函数f(X)时,它就变成了 f(X列表) 这个过程叫什么?这是怎么一回事?它的函数式编程名称是什么 这不是咖喱。我知道simplemap9(f,Xs列表)可以做到这一点 从数学上讲,什么是装饰器/装饰操作 它们被简单地称为Decorators。它所做的可以称为函数链接或函数注释,但我环顾四周,发现除了这两个(链接/注释)之外,这个过程没有特殊的函数/数学名称 关于“装饰者”这个名字 关于这个名字的选择有很多抱怨 此功能的“装饰器”。主要的一点是,这个名字

这是我几年前写的。当你用
@foo
装饰任何函数
f(X)
时,它就变成了
f(X列表)

这个过程叫什么?这是怎么一回事?它的函数式编程名称是什么

这不是咖喱。我知道simple
map9(f,Xs列表)
可以做到这一点


从数学上讲,什么是装饰器/装饰操作

它们被简单地称为
Decorators
。它所做的可以称为
函数链接
函数注释
,但我环顾四周,发现除了这两个(链接/注释)之外,这个过程没有特殊的函数/数学名称

关于“装饰者”这个名字

关于这个名字的选择有很多抱怨 此功能的“装饰器”。主要的一点是,这个名字不是 与GoF手册[11]中的使用一致。“装饰者”这个名字 可能更多地归功于它在编译器领域的使用——语法树是 步行和注释。很可能会有更好的名字 起来


装饰器只是有特殊的语法,但没有装饰器可以返回的规则,也没有数学描述。毕竟,他们可以是任何人

您的函数只是部分应用的星图:

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))

在Haskell这样的函数式语言中,您可以通过将
map
函数部分应用于接受参数元组的函数,从而生成接受参数元组列表的函数。正如Jochen Ritzel在另一个回答中指出的那样,即使在Python中,也可以使用
functools.partial
非常简单地实现这一点


因此,我认为这个过程被称为“map的部分应用”,或者类似的事情。我不知道这个特殊情况有什么特殊名称。

对原始函数执行了两种转换:

  • 它从一个包含三个参数的函数转换为一个包含三元组的函数
  • 从一个三元组函数到一个三元组列表函数的转换
  • 第一次转换
    在Haskell中,有一个名为
    uncurry
    的函数。(这是一个双参数版本;也可以轻松创建3-、4-、…版本)

    第二次转换
    在Haskell中,还有一些函数的名称中带有
    lift
    。Haskell wiki上关于提升的页面。我认为这一页比我能解释得更好:

    from functools import partial
    from itertools import starmap
    
    def foo(f):
        return partial(starmap, f)
    
    在您的例子中,您将函数从对元组的操作提升到对元组列表的操作


    注:

    • OP询问装饰师的数学名称。我不知道那会是什么,但我听说Haskell应该像可执行数学一样,所以我认为Haskell的术语是一个很好的起点。YMMV
    • OP询问这些进程的FP名称。同样,我不知道,但我认为哈斯克尔的术语是可以接受的

    我不认为这个问题是关于生成器的,而是关于问题中特定的装饰器所执行的转换。我想知道装饰器在数学上被称为什么?不是100%确定,但也许反向咖喱是您要搜索的?请看这里:也许,但在这种情况下,函数仍然使用单参数。
    Lifting is a concept which allows you to transform a function into a   
    corresponding function within another (usually more general) setting.