如何在Haskell中构建非确定性状态单子?
我想在哈斯克尔建立一个不确定的状态单子。这将允许我使用构建状态生成搜索空间中的所有元素,以修剪坏位置。假设我有以下(伪)代码:如何在Haskell中构建非确定性状态单子?,haskell,state-monad,non-deterministic,Haskell,State Monad,Non Deterministic,我想在哈斯克尔建立一个不确定的状态单子。这将允许我使用构建状态生成搜索空间中的所有元素,以修剪坏位置。假设我有以下(伪)代码: 原语::[状态Int元素] 基本体=[…基本体有状态元素列表…] 组合::元素->元素->状态Int元素 expand::Depth->[状态Int元素] 展开0=基本体 展开d=do ... 对国家做点什么。。。 左一个简单的状态单子定义为: data State s a = State (s -> (a, s)) 这表示一个自包含的、确定性的有状态计算。将[
原语::[状态Int元素]
基本体=[…基本体有状态元素列表…]
组合::元素->元素->状态Int元素
expand::Depth->[状态Int元素]
展开0=基本体
展开d=do
... 对国家做点什么。。。
左一个简单的状态
单子定义为:
data State s a = State (s -> (a, s))
这表示一个自包含的、确定性的有状态计算。将[]
视为非确定性单元组,可以使用[State s a]
表示非确定性计算集,或者使用State s s[a]
表示产生非确定性值集的确定性计算。在这两种情况下,有状态计算本身的结构中都不存在任何非确定性
要以您想要的方式实际组合状态和非决定论行为,您需要以一种仅使用状态
无法实现的方式组合二者;这就是monad transformers的用途。类型StateT s[]a
相当于:
data NonDetState s a = NonDetState (s -> [(a, s)])
这给你的是状态值中的非确定性,在计算中的任何一点上只能观察到单个选择
这不允许分支之间的任何交互;在一个分支中所做的状态更改从其他分支中永远看不到,这是非确定性计算中通常需要的。StateT monad允许您跟踪状态,同时也使用另一个monad,例如IO或Rand(用于随机值)。如果我正确理解了你的问题,我想StateT会解决你的问题。你能举例说明你想在基元
数组中拥有什么样的东西吗?听起来像是LogicT monad transformer:你的非确定状态monad是LogicT(state Int)元素
。公平连接、条件和修剪作为奖励。比简单列表更有效的实现。一般说明:不要构建自己的组合单子,使用单子转换器。
data NonDetState s a = NonDetState (s -> [(a, s)])