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/4/fsharp/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_F#_Functional Programming_Monads_Non Deterministic - Fatal编程技术网

Haskell 如何用列表单子对非确定性建模?

Haskell 如何用列表单子对非确定性建模?,haskell,f#,functional-programming,monads,non-deterministic,Haskell,F#,Functional Programming,Monads,Non Deterministic,有人能解释一下(最好用简单的英语举例)列表单子对非确定性计算的建模功能吗?即问题是什么,列表单子可以提供什么解决方案。当我们说它是非决定论时,它意味着它有多个值 这本书很好地解释了这一点: 像5这样的值是确定的。它只有一个结果,我们知道 确实是这样。另一方面,像[3,8,9]这样的值包含 多个结果,因此我们可以将其视为一个值,实际上是多个值 价值观同时存在。使用列表作为应用程序函子展示 这种非决定论很好地: 因此,当您输入一个非确定性值时,它将产生另一组非确定性值: ghci> [3,4,

有人能解释一下(最好用简单的英语举例)列表单子对非确定性计算的建模功能吗?即问题是什么,列表单子可以提供什么解决方案。

当我们说它是非决定论时,它意味着它有多个值

这本书很好地解释了这一点:

像5这样的值是确定的。它只有一个结果,我们知道 确实是这样。另一方面,像[3,8,9]这样的值包含 多个结果,因此我们可以将其视为一个值,实际上是多个值 价值观同时存在。使用列表作为应用程序函子展示 这种非决定论很好地:

因此,当您输入一个非确定性值时,它将产生另一组非确定性值:

ghci> [3,4,5] >>= \x -> [x, x * 2]
[3,6,4,8,5,10]

列表单子可以表示“非确定性计算的所有可能结果”。例如,函数

f x = [x, x + 1, x + 2]
g x = [2 * x, 3 * x]
可以解释为非确定性计算,它采用
x
并返回
x
x+1
x+2
中的一个

功能

f x = [x, x + 1, x + 2]
g x = [2 * x, 3 * x]
可以解释为采用
x
并返回
2*x
3*x
的非确定性计算。这两个非确定性计算的“组合”应该是另一个非确定性计算,它采用
x
,将其转换为
x
x+1
x+2
,然后将其加倍或三倍。因此,在列表方面,结果应该是所有六种可能性的列表

现在


尽管无可否认,这是一个完全武断和没有动机的例子

因此,明确定义“非确定性”在这里的含义是很重要的,因为它与在(比如)非确定性算法中的感知方式不太一样。这里捕捉到的感觉是,计算分支——系统可以在任何特定点移动到多个状态


列出此模型是因为它们包含多个元素。更重要的是,一元理解为我们提供了一种合成非确定性结果的方法——即一次对所有分支进行建模探索

下面是一个基于抛硬币的例子。问题如下:

你有两枚硬币,标着有偏见的和公平的。有偏见的硬币有两个头,而公平的硬币有一个头和一条尾巴。从这些硬币中随机挑选一枚,抛来抛去,观察结果。如果结果是一个人头,你选择有偏硬币的概率是多少

我们可以在Haskell中对此进行如下建模。首先,你需要硬币的类型和它们的表面

data CoinType=Fair |有偏推导(Show)
数据硬币=头部|尾部推导(等式,显示)
我们知道,抛一枚公平的硬币可能会出现头部或尾部,而有偏见的硬币总是出现头部。我们用一系列可能的备选方案(隐式地说,每种可能性都具有同等的可能性)对此进行建模

toss Fair=[头,尾]
投掷偏斜=[头部,头部]
我们还需要一个随机挑选公平或有偏见硬币的函数

pick=[公平,有偏见]
然后我们就这样把它放在一起

实验=do

在这里输入正确答案。添加一些东西,我认为
sequence
就是一个很好的例子。例如,
sequence[“cbs”、“ae”、“tb”]
可以让你从每个元素中选择一个字母组成一个单词。下一个来这里的人能留下评论说你来自哪里吗?我很想知道为什么一年后这个答案突然获得了大量的选票!我正在Haskell上一门关于edx的课程,试图了解monads。我是通过谷歌搜索带到这里的。@ChrisTaylor最近从这里链接到:。回答得不错!这与PROMELA中的模型检查有何可比性?当有很多状态时,它会像旋转一样表现吗?GHC会从中构建Büchi自动机吗?@JanusTroelsen GHC会构建一个包含所有可能输出的列表,包括重复输出。因此,它通常效率非常低(例如,它无法将具有相同结果的多条路径折叠为一条路径)。有一些基于集合或关联数组(贴图)的分布建模方法可以有效地折叠等效状态,但通常需要非常小心,以免状态空间意外爆炸。目前,面向概率的语言在这项任务上比Haskell这样的通用语言具有优势。
g =<< f x = [2 * x, 3 * x, 2 * (x + 1), 3 * (x + 1), 2 * (x + 2), 3 * (x + 2)]
g 0 = [1000, 1001]
g x = [2 * x, 3 * x, 4 * x]