1

我正在以函数式风格编写 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)
4

2 回答 2

1

这是非常单调的。

您可能想要做的是使用 monad 的bind函数(在这种情况下使用 Maybe 或 Either monad)运行折叠,尽管您的各个函数必须返回一个 monadic 值(即您希望原始返回的列表值包裹在 monad 的特定值构造函数中的函数)。

您的最终调用将是这样的(在 Haskell 和 Python 的混合中):

fold Maybe.bind Maybe.mreturn(car) funcs

(您可能希望 Maybe.bind 在 lambda 中,因为 python 不像 Haskell 那样做部分应用程序,我只是懒惰。)

这是一个帮助您入门的python monad 库/脚本。

于 2013-01-11T19:47:55.200 回答
0

也许是这样的:

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)
于 2013-01-11T19:46:24.130 回答