在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列表)
这个过程叫什么?这是怎么一回事?它的函数式编程名称是什么
这不是咖喱。我知道simplemap9(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名称。同样,我不知道,但我认为哈斯克尔的术语是可以接受的
Lifting is a concept which allows you to transform a function into a
corresponding function within another (usually more general) setting.