Haskell で内部状態を持つ 2 つの相互プロデューサー/コンシューマーを作成するにはどうすればよいですか?
-
20-08-2019 - |
質問
状態とアクションのペアのユーティリティの内部表現を保持しながら、状態を取得してアクションを返すエージェントがあります。アクションを受け取り、状態と報酬のペアを返す環境もあります。
エージェントを開始状態で設定し、エージェント -(アクション)->環境 -(状態、報酬)->エージェント -(アクション)->... と継続的に移行できる必要があります。ただし、内部状態 (反復ごとに更新する必要がある) は、プライベート (つまり、エージェントまたは環境内) に保つ必要があります。これは、状態とアクションを引数として使用して、エージェント内の関数として単に環境を呼び出すことができないことを意味します。
私は Haskell 初心者なので、これが可能かどうかさえわかりません。
解決
2 つの質問:
エージェントがアクションを計算するために状態を使用する必要がある場合、状態の表現をエージェントから秘密にするにはどうすればよいでしょうか?
環境がアクションを与えられて状態 (および報酬) を生成することを期待している場合、状態の表現を環境から秘密に保つにはどうすればよいでしょうか?
これらはどちらも可能ですが、それぞれに状態のクエリまたは状態の作成のための何らかの抽象化が必要です。このデザインにはあまり良い印象を持ちません。
質問を明確にするのに役立ちます
対象の関数に型シグネチャを提供する
どの関数に状態を表現するかを特定する ない 暴露されること。
追伸これらの問題は Haskell から完全に切り離すことができ、実装言語の選択に関係なく問題となります (実装言語がサポートしている場合に限ります)。 いくつかの プライバシーの一種)。
他のヒント
あなたは「上」に座っエージェントと環境のどちらかを決定する必要があります - さんは、それが一般的に最も理にかなっているので、それはエージェントへの呼び出し上の環境だと、この答えの残りの部分と仮定してみましょう。
あなたはモジュールシステムを使用してプライベートエージェントのデータ表現を維持することができます - ちょうどその内部のいずれかせずにデータ型の名前をエクスポートします。
module Agent (AgentState, other_stuff) where
タグにopposdとして
module Agent (AgentState(..), other_stuff) where
彼らができるように、エージェントはまた、環境の状態を渡す必要がある場合には(私は環境が自身のためにそれを追跡することができ、これは必要であろう何らかの理由を見ることができないが)、その後、エージェント機能が多型にしますその後、環境は、その表現が露出されることなく、中に好きなものは何でも渡すことができます。
- のいずれかのの状態の種類を通過しました。また、エージェントがそれを与える状態を複製し、その同じ状態で繰り返しエージェントを呼び出すことから環境を防ぐ例えば、状態がどうなるかをより細かく制御を実現するために、状態モナドを使用することが可能でなければなりませんが、あなた」の場合Haskellのために新たに再それが最初のモナドのない経験のビットを取得するには、おそらく最善です。 (モナドは特に怖いか何かされているが、それは何が起こっているのか確認するために困難ですので、彼らはあなたからの詳細を隠すしないこと。)