gpt4 book ai didi

arrays - 我应该如何结合 St monad 和 State monad(或等效物)?

转载 作者:行者123 更新时间:2023-12-01 08:59:09 29 4
gpt4 key购买 nike

我正在构建代码以获得理解,实际上是一个纸牌求解器。
我有一个简单的蛮力实现,它使用 State monad,实际上只是为了证明我可以使用它(它只保留每个评估的移动计数)。
但是现在我想使用 Unboxed Mutable 数组来记录访问过的板,从而在我到达已经通过另一条路径访问过的板位置时对路径进行快捷评估。
似乎 ST monad 不允许我线程隐式状态,但我必须使用 ST(或 IO),以便访问可变数组。所以看来我必须结合两个 Monads - State 来线程化状态(实际上将包含一个可变数组),另一个 (ST) 来获取可变数组函数。

  • 这是正确的吗?
  • 如果是这样,有没有比 Data.Array.ST/Control.Monad.ST/Control.Monad.ST 和 mtl 的(规范?)组合更好的选择?
  • 如果我走这条路线,我堆叠 ST 和 State 的顺序有关系吗?
  • 为了避免使用 monad 转换器,我是否应该考虑基于 ST 或 State 之一或两者滚动我自己的单个 Monad?
  • 最佳答案

    我不是 100% 确定 ST monad 是提高此类搜索任务性能的方法。但是假设它是...您可以通过将您想要保留的状态放入 STRef 来“线程状态”。 .您可以在不需要将多个 monad 混合在一起的情况下执行此操作,这会让事情变得更简单。

    如果您想要可变状态,您肯定需要 ST 或 IO monad。 (或 STM monad,但这仅用于线程同步,此处不需要。)

    monad 的堆叠顺序可能很重要 - 但在这种情况下,它并不重要。如果你有类似 List monad 和 Error monad 的东西,那么根据堆叠顺序,错误要么只失败列表中的一种可能性,要么失败列表中的所有可能性。对于您的情况,没有任何影响会根据堆栈顺序而改变。

    ...这是幸运的,因为没有将事物转换为 ST 的变压器。所以 ST 必须是内部 monad。

    说了这么多,再说一次,我认为您实际上不需要在这里使用 monad 堆栈。我想一个简单的STRef会做。

    关于arrays - 我应该如何结合 St monad 和 State monad(或等效物)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21918855/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com