Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell中构建非确定性状态单子?_Haskell_State Monad_Non Deterministic - Fatal编程技术网

如何在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)])