1

私は関数型でPythonを書いています(私が得ているのはモナドに似ていると思いますか?)。これが私がこれまでに持っているもので、3つの関数のためにハードコーディングされています。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

それは非常に単調です。

あなたがおそらくやりたいことは、モナドのbind関数を使って (この場合は Maybe モナドまたは Each モナドを使って) 折り畳みを実行することですが、個々の関数はモナド値 (つまり、元のモナドの特定の値コンストラクターにラップされた関数)。

エンド コールは次のようになります (Haskell と Python の混合):

fold Maybe.bind Maybe.mreturn(car) funcs

(Python は Haskell のような部分的なアプリケーションを実行しないため、Maybe.bind をラムダにしたいでしょう。私は単に怠け者でした。)

これは、始めるためのpython モナド ライブラリ/スクリプトです。

于 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 に答える