【发布时间】:2010-02-17 15:00:19
【问题描述】:
前段时间我查看了 Haskell 文档,发现它的函数式组合运算符非常好。所以我实现了这个小装饰器:
from functools import partial
class _compfunc(partial):
def __lshift__(self, y):
f = lambda *args, **kwargs: self.func(y(*args, **kwargs))
return _compfunc(f)
def __rshift__(self, y):
f = lambda *args, **kwargs: y(self.func(*args, **kwargs))
return _compfunc(f)
def composable(f):
return _compfunc(f)
@composable
def f1(x):
return x * 2
@composable
def f2(x):
return x + 3
@composable
def f3(x):
return (-1) * x
@composable
def f4(a):
return a + [0]
print (f1 >> f2 >> f3)(3) #-9
print (f4 >> f1)([1, 2]) #[1, 2, 0, 1, 2, 0]
print (f4 << f1)([1, 2]) #[1, 2, 1, 2, 0]
问题: 如果没有语言支持,我们就不能像这样在内置函数或 lambdas 上使用这种语法:
((lambda x: x + 3) >> abs)(2)
问题: 有用吗?值得在 python 邮件列表上讨论吗?
【问题讨论】:
-
...但仍然可以这样写: print (composable(lambda x: x + 3) >> composable(abs))(-4)
-
对于数学函数,通常使用 * 表示合成,使用 + 表示函数求和,例如 (f * g + h)(x) = f(g(x)) + h(x)。并且还可以使用幂运算符:f**2(x) = f(f(x)) 等...
标签: python function-composition