POMDPのためにopen source libraryをやっています。これはフードの下でDynamic Programmingを使用して、あるコスト関数で他の2D空間を検索します。ハスケルでMonad.Memoと環境をリーダーと結合する
DPインプリメンテーションmasterブランチは、Haskellのレイジー評価を使用するDPメモ化の場合はMemoTrieに基づいています。そして私は調整可能であるために費用関数を持つ必要があります。 MemoTrieの怠惰なアプローチではこれがうまくいきません。私は純粋なtryをしましたが、期待どおり、秒の代わりにすべてのテストを完了するのに数時間かかります。
私はMonad.Memoでモナドのアプローチを決めました。 Here is Readerのコンテキストを使用しないで動作します。しかし、今私は、この計算のためのReaderのコンテキストを導入するための適切な方法で苦労しています。
このtry私はMonadReaderを導入するために制約を使用しました。同時に、私は制約としてfqとfvの相互再帰を記述することができず、fqだけをメモしようとしました。しかしMonadMemoのMonadReader型クラス実装でさえ、Readerコンテキストをキーの一部として配置し、コンテキストは関数であるため、マッピングのキーの一部になることはほとんどありません。私はライターのモナドだけを包み込むことができました:
:t fst . startEvalMemo . runWriterT $ fq 1 1 1
さらに、リーダーをアンラップすることもできませんでした。
最後に試してみましたuse ReaderTです。しかし、だから私はHaskellの中に生産的に苦労していますが、私はそれをこのような質問を学んでいるよう
• Occurs check: cannot construct the infinite type: v ~ [v]
arising from a functional dependency between:
constraint ‘MapLike
(containers-0.5.7.1:Data.Map.Base.Map (n, n, n) [v]) (n, n, n) v’
arising from a use of ‘memol1’
instance ‘MapLike (containers-0.5.7.1:Data.Map.Base.Map k v1) k v1’
at <no location info>
• In the first argument of ‘for3’, namely ‘memol1’
In the expression: for3 memol1 fv n
In an equation for ‘v’: v = for3 memol1 fv n
• Relevant bindings include
v :: n -> n -> ReaderT (DynamicEnv n v) (MemoQV n v) v
(bound at src/Dynamic.hs:136:9)
ようなものを与えてこれはないコンパイルは私に長い時間がかかります。あなたからのアドバイスを聞いてうれしいですね。
ありがとうございます!それは問題を解決する! – aliko