一个用于顺序、条件和修改函数应用的高阶函数?

2024-06-10 23:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我用函数式的风格编写Python(我想我得到的是类似于monad的东西?)。这是到目前为止,我有三个函数的硬编码。如果我有10个或100个呢?

    # a list of (function, function, function), each of which accept 
    # a scalar and return a list
    funcs = [(lambda a: [a, a], lambda a: [a, a, a], lambda a: [a])] * 10

    possible = []
    car = 3
    for a, b, c in funcs:
        ra = a(car)
        if ra:
            rb = b(ra[0])
            if rb:
                rc = c(rb[0])
                if rc: # last function
                    possible.extend(rc)

Tags: oflambda函数编码if风格functioncar
2条回答

也许是这样的:

funcs = [(lambda a: [a, a], lambda a: [a, a, a], lambda a: [a])] * 10
initial = [3]
result = []
for function_chain on funcs:
    running = initial
    for function in function_chain:
        running = function(running[0])
        if not running[0]:
            break
    else:
        result.extend(running)

那是非常独居的。在

您可能想要做的是使用monad的bind函数运行一个fold(在本例中使用Maybe或one monad),尽管您的单个函数必须返回一个单体值(即,要由monad的特定值构造函数包装的原始函数返回的列表值)。在

您的结束调用如下所示(混合使用Haskell和Python):

fold Maybe.bind Maybe.mreturn(car) funcs

(你会想要也许吧。绑定可能是因为python不像Haskell那样做部分应用程序,所以我只是在偷懒。)

这里有一个python monad library/script让你开始。在

相关问题 更多 >