【发布时间】:2014-12-03 07:25:37
【问题描述】:
Haskell 程序员提到非确定性是什么意思?我读到列表单子可用于建模非确定性,但列表肯定不是非确定性的吗?对非确定性建模意味着什么?据我所知,这只是意味着为一组计算返回一组所有可能的结果。
【问题讨论】:
-
This SO question 可能会有所帮助。
标签: haskell
Haskell 程序员提到非确定性是什么意思?我读到列表单子可用于建模非确定性,但列表肯定不是非确定性的吗?对非确定性建模意味着什么?据我所知,这只是意味着为一组计算返回一组所有可能的结果。
【问题讨论】:
标签: haskell
你的理解是正确的。列表单子捕获的不确定性确实处理可以返回多个可能结果的计算(函数)。
也就是说,一个计算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
【讨论】: