【问题标题】:Combine Monad.Memo with environment through Reader in Haskell通过 Haskell 中的 Reader 将 Monad.Memo 与环境结合起来
【发布时间】:2017-10-25 09:05:25
【问题描述】:

我正在为POMDPopen 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


    【解决方案1】:

    在使用ReaderT 的版本中,您的Dynamic monad 在MemoQV 周围多了一层。

    在伪haskell中,使用:

    type R = ReaderT (DynamicEnv n r)
    type L1 = MemoQ n r
    type L2 = MemoV n r
    

    之前的类型看起来像

       L1 (L2 Identity)
    -- 0   1
    

    我们从“顶部”开始对变压器进行编号,从 0 开始。 相比之下,Dynamic 现在看起来像

       R (L1 (L2 Identity))
    -- 0  1   2
    

    由于您在顶部插入了转换器R,缓存转换器被移得更深。

    这对 memol0memol1memol2 组合器很重要:memolN 使用 Nth 层(因此预计具有匹配类型)来记忆计算,因此您需要更新您的当这些层移动时相应地编码。

    您使用memol1 herememol0 here。当您将它们分别向上移动到 memol2memol1 时,文件将编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2014-07-21
      • 2012-05-14
      • 2017-04-08
      • 1970-01-01
      • 2017-04-06
      • 2021-09-28
      相关资源
      最近更新 更多