Python中的链接操作

Python中的链接操作,python,regex,Python,Regex,我正在通过一系列操作运行字符串,其中大多数是正则表达式,有些不是。我想知道是否有一些类似于单子的语法结构,可以让函数的顺序应用“更漂亮” 即,对于函数f、g、h、I和输入字符串s: f(s) -> g -> h -> i 而不是 i g h f(s) 您可以创建一个小助手函数来执行类似的操作: import functools as ft # Py3 reduce def func(arg, *funcs): return ft.reduce(lambda a,

我正在通过一系列操作运行字符串,其中大多数是正则表达式,有些不是。我想知道是否有一些类似于单子的语法结构,可以让函数的顺序应用“更漂亮”

即,对于函数f、g、h、I和输入字符串s:

f(s) -> g -> h -> i
而不是

i g h f(s)

您可以创建一个小助手函数来执行类似的操作:

import functools as ft   # Py3 reduce
def func(arg, *funcs):
    return ft.reduce(lambda a, f: f(a), funcs, arg)

>>> f = lambda x: x+1
>>> g = lambda x: x*2
>>> h = lambda x: x**2
>>> func(4, f, g, h)
100
或助手类:

class Func(object):
    def __init__(self, arg):
        self.arg = arg

    def __call__(self, *funcs):
        return ft.reduce(lambda a, f: f(a), funcs, self.arg)

>>> Func(4)(f, g, h)
100
但我不太清楚为什么这比:

>>> func = lambda x: h(g(f(x)))
>>> func(4)
100

您可以创建一个小助手函数来执行类似的操作:

import functools as ft   # Py3 reduce
def func(arg, *funcs):
    return ft.reduce(lambda a, f: f(a), funcs, arg)

>>> f = lambda x: x+1
>>> g = lambda x: x*2
>>> h = lambda x: x**2
>>> func(4, f, g, h)
100
或助手类:

class Func(object):
    def __init__(self, arg):
        self.arg = arg

    def __call__(self, *funcs):
        return ft.reduce(lambda a, f: f(a), funcs, self.arg)

>>> Func(4)(f, g, h)
100
但我不太清楚为什么这比:

>>> func = lambda x: h(g(f(x)))
>>> func(4)
100
这是相当全面的。它展示了如何在python中进行咖喱,但它不像haskell那样自然。也许这就是你想要的。这是相当全面的。它展示了如何在python中进行咖喱,但它不像haskell那样自然。也许这就是你想要的。