【发布时间】:2023-03-16 11:31:01
【问题描述】:
我想在 Haskell 中构建一个不确定的状态单子。这将允许我使用构建状态生成搜索空间中的所有元素以修剪不良位置。假设我有以下(伪)代码:
primitives :: [State Int Element]
primitives = [... list of primitive stateful elements ...]
combine :: Element -> Element -> State Int Element
expand :: Depth -> [State Int Element]
expand 0 = primitives
expand d = do
... do something to the state ...
left <- expand (d-1)
right <- expand (d-1)
let out = combine left right
guard ( ... some check on out ... )
return out
这里有几件事是行不通的:我需要了解的最基本的事情是如何做一些事情来陈述,然后将其传递到每个expand 分支。我用State Int [ State Int Element] 类型的函数尝试了很多方法,但最终,一旦我将列表单子的分支包装在状态包装器中,我就无法删除它,对吧?那么有没有办法做到这一点?
谢谢。
【问题讨论】:
-
StateT monad 允许您跟踪状态,同时还可以使用另一个 monad,例如 IO 或 Rand(用于随机值)。如果我正确理解了您的问题,我认为 StateT 将解决您的问题。您能否举例说明您希望在
primitives数组中包含哪些内容? -
听起来像 LogicT monad 转换器:hackage.haskell.org/package/logict,你的非确定性状态 monad 是
LogicT (State Int) Element。公平的连词,条件和修剪作为奖励。比简单的列表更有效的实现。 -
一般说明:不要构建自己的组合 monad,使用 monad 转换器。
标签: haskell state-monad non-deterministic