2016-11-26 20 views
0

関数型プログラミングを使用して単純な環境を実装しようとしている強化学習を試しています。関数の構成とwhileループを使ったPython関数型プログラミングリストの理解

私には、機能step: State, Action -> Stateaction_space: State -> [Action, ...]があります。

私は初期 State

s = State() 
e = [s] 
while action_space(s): 
    a = best(action_space(s)) 
    s = step(s, a) 
    e.append(s) 

上で機能stepの反復構成を実現するための関数型プログラミングの方法を探してい

だから私は、私は必要だと思うものを理解[f(x) and c(x), f(f(x)) and c(f(x)), f(f(f(x))) and c(f(f(x)), ...]を作成するための方法ですが、不要な評価なし。

ありがとうございます。

+0

あなたの質問は?この混乱している仕様を考えて私のためにコードを書いてください?いずれにしても、あなたが望むのは、Pythonの折り畳み操作であるuse ['functools.reduce'](https://docs.python.org/3.5/library/functools.html#functools.reduce)です。 – Bakuriu

+0

@Bakuriu実際には、これは[展開](https://en.wikipedia.org/wiki/Anamorphism)です。 – phg

+0

@Bakuriu私は方向や少なくともいくつかのキーワードを探しています。私が探している解決策は、正確には 'reduce'の中身です。 'reduce'は2つの要素を取って1つを返しますが、必要な関数は1(最後の)要素をとり、2つを返します - 関数と関数を適用した後の関数です。私は 'expand'がその名前になるかもしれないと思います。 – FPFTW

答えて

1

このシナリオでは理解できませんが、ジェネレータを作成することができます。それに入る前に、私はまた、あなたは彼らがfalsy何か(のようなFalseまたはNone)を返すようにあなたの最高ステップ関数を定義することを示唆している時はいつでも、最後の(アクション)引数がfalsyです。それはあなたのコードを簡素化します。

次に、このジェネレータを定義することができます。

def unfold(s): 
    while s: 
     yield s 
     s = step(s, best(action_space(s))) 

これは怠惰であるという利点を有しています。名前付きの必要性を見つけた場合

def unfold(s): 
    return [s] + unfold(step(s, best(action_space(s)))) if s else [] 

e = unfold(State()) 

:より多くの関数型プログラミングのアプローチは、この再帰関数可能性があり

e = list(unfold(State())) 

e = [s for s in unfold(State())] 

それとも:あなたはこのようにそれを使用することができますあなたはこのトリックのために行くことができる:

e = (lambda unfold:lambda s:unfold(unfold,s))(
     lambda unfold, s: [s] + unfold(unfold, step(s, best(action_space(s)))) if s else [] 
    )(State()) 

これはかなり不明です。最初の関数は、別の関数を引数として(2行目の関数として)直ちに呼び出されます。実際のの関数を展開します。この関数は、最初の関数のパラメータ名で名前になります。

そしてこの第一の機能は、状態引数を受け取り、別の機能(lambda s:unfold(unfold,s))を返し、がそれにを展開呼び出します。また、その関数をすぐに呼び出して、初期値State()を渡します。

unfoldもまた、範囲内に保持するために再帰ツリーに渡されることに注意してください。

+0

私はそれが近いと思います。それは正しい結果をもたらしますが、純粋な関数型プログラミングではありません。 – FPFTW

+0

もっと機能的なプログラミング*であるいくつかの選択肢が追加されました。 – trincot

+0

ああ、ありがとうございます@トリコット – FPFTW

関連する問題