Haskell 中的非确定性是啥?
Posted
技术标签:
【中文标题】Haskell 中的非确定性是啥?【英文标题】:What is non-determinism in Haskell?Haskell 中的非确定性是什么? 【发布时间】:2014-12-03 07:25:37 【问题描述】:Haskell 程序员提到非确定性是什么意思?我读到列表单子可用于建模非确定性,但列表肯定不是非确定性的吗?对非确定性建模意味着什么?据我所知,这只是意味着为一组计算返回一组所有可能的结果。
【问题讨论】:
This SO question 可能会有所帮助。 【参考方案1】:你的理解是正确的。列表单子捕获的不确定性确实处理可以返回多个可能结果的计算(函数)。
也就是说,一个计算f
从A
类型的输入非确定性地计算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 中的非确定性是啥?的主要内容,如果未能解决你的问题,请参考以下文章