【发布时间】:2017-10-25 09:05:25
【问题描述】:
我正在为POMDP 做open source library。它在底层使用Dynamic Programming 来搜索具有某些成本函数的其他二维空间。
master 分支中的 DP 实现基于 MemoTrie 用于使用 Haskell 惰性求值的 DP 记忆。而且我需要具有成本函数才能进行调整。我相信这不会很好地配合 MemoTrie 的懒惰方法。我做了一个幼稚的try,但正如预期的那样,通过所有测试需要几个小时而不是几秒钟。
我决定使用Monad.Memo 的一元方法是一种可行的方法。 Here is 第一次尝试虽然不使用任何阅读器上下文,但仍然有效。但是现在我正在努力寻找正确的方法来为这个计算引入 Reader 上下文。
这个try我用约束来介绍MonadReader。同时,我无法将 fq 和 fv 的相互重复描述为约束,只是尝试仅记忆 fq。但即便如此 MonadMemo 的 MonadReader 类型类实现将 Reader 上下文作为键的一部分,并且由于我的上下文是一个函数,它几乎不可能是映射的(部分)键。我只能将东西解包到 Writer monad:
:t fst . startEvalMemo . runWriterT $ fq 1 1 1
而且也无法进一步打开阅读器。
上次我尝试useReaderT。但这并不能编译给像
这样的东西• 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)
所以我在 Haskell 中努力提高工作效率,但是当我学习它时,像这样的问题需要我很长时间。很高兴听到您的任何建议!
【问题讨论】:
标签: haskell monads memoization monad-transformers