我想在Haskell中构建一个不确定状态monad。这将允许我使用内置状态生成搜索空间中的所有元素以修剪不良位置。假设我有以下的(伪)代码:如何在Haskell中构建一个不确定的状态monad?
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]
的函数,但是最终一旦我在状态包装中包装了列表monad的分支,我无法删除它,对吧?那么有没有办法做到这一点?
谢谢。
StateT monad允许您跟踪状态,同时也利用另一个monad,如IO或Rand(用于随机值)。如果我已经正确理解你的问题,我认为StateT将解决你的问题。你能举一个你想在'primitives'数组中有什么样的东西的例子吗? – mhwombat
听起来像LogicT monad变换器:http://hackage.haskell.org/package/logict与您的非确定性状态monad是'LogicT(状态Int)元素'。公平的连词,条件和修剪作为奖励。比简单列表更有效的实现。 –
一般注意事项:不要建立自己的组合单体,使用单体变压器。 – permeakra