Haskell 中的非确定性是啥?

Posted

技术标签:

【中文标题】Haskell 中的非确定性是啥?【英文标题】:What is non-determinism in Haskell?Haskell 中的非确定性是什么? 【发布时间】:2014-12-03 07:25:37 【问题描述】:

Haskell 程序员提到非确定性是什么意思?我读到列表单子可用于建模非确定性,但列表肯定不是非确定性的吗?对非确定性建模意味着什么?据我所知,这只是意味着为一组计算返回一组所有可能的结果。

【问题讨论】:

This SO question 可能会有所帮助。 【参考方案1】:

你的理解是正确的。列表单子捕获的不确定性确实处理可以返回多个可能结果的计算(函数)。

也就是说,一个计算fA 类型的输入非确定性地计算B 类型的输出然后在Haskell 中由一个函数表示,该函数将A 类型的值带到列表 em> 类型的值 B:

f :: A -> [B]

然后,如果我们还有计算 g,它(也是非确定性的)从 B 类型的输入计算 C 类型的输出,

g :: B -> [C]

我们可以组合这些计算以获得组合计算h,它将A 类型的输入与C 类型的输出相结合:

h :: A -> [C]

在 Haskell 中,定义这样的函数 h 涉及将函数 g 应用于应用程序 f x 的每个可能结果,然后将由此获得的 h 可能结果列表展平:

h x = concat zs where zs = [g y | y <- f x]

list monad 捕捉到的正是这种组合,让你可以写:

h x = f x >>= g

甚至

h = f >=> g

【讨论】:

非常感谢。我没有在其他地方看到这么清楚的解释。

以上是关于Haskell 中的非确定性是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 模式匹配 - 它是啥?

Haskell 中的“让”和“进入”是啥意思?

在 Haskell 中的 Applicative 中 <*> 的词源是啥?

GHC Haskell 中的自动记忆功能是啥时候?

$ 在 Haskell 中是啥意思/做啥?

=> 符号在 Haskell 中是啥意思?