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

4

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

  1. 它从三个参数的函数转换为采用三元组的函数
  2. 从 3 元组的函数转换为采用 3 元组列表的函数

第一次转换
在 Haskell 中,有一个名为 的函数uncurry,记录在这里。(这是一个双参数版本;也可以轻松创建 3-、4-、... 版本)。

第二个转换
同样在 Haskell 中,有一组函数lift名称中带有 。 这是Haskell wiki 上关于提升的页面。我认为该页面比我能更好地解释它:

Lifting is a concept which allows you to transform a function into a   
corresponding function within another (usually more general) setting.

因此,在您的情况下,您将函数从对元组进行操作提升到对元组列表进行操作。


笔记:

  • OP 要求提供装饰器的数学名称。我不知道那会是什么,但我听说 Haskell 应该像可执行数学,所以我认为 Haskell 的术语是一个很好的起点。YMMV。
  • OP 要求提供这些进程的 FP 名称。同样,我不知道,但我认为 Haskell 的术语是可以接受的。
于 2011-10-17T17:55:33.877 回答
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。它的作用可以称为function chainingor function annotation,但我环顾四周,发现除了这 2 个(链接/注释)之外,这个过程没有特殊的函数/数学名称。

PEP 索引 > PEP 318 -- 函数和方法的装饰器

以“装饰者”为名

对此功能选择名称“装饰器”有很多抱怨。主要的一个问题是该名称与 GoF 书籍 [11] 中的使用不一致。“装饰器”这个名字可能更多地归功于它在编译器领域的使用——一个语法树被遍历和注释。很可能会出现一个更好的名字。

于 2011-10-16T15:05:28.953 回答