2014-12-03 62 views
2

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

+0

[这太问题(http://stackoverflow.com/questions/20638893/how-can-non-determinism-be-modeled-with-a-list-monad)可能会有所帮助。 – ErikR 2014-12-03 07:52:20

回答

4

你的理解是正确的。列表monad捕获的非确定性确实涉及可以返回多个可能结果的计算(函数)。

也就是说,计算f该不确定地从B类型的输入计算A类型的输出然后在通过使用带A类型的值来列表B类型的值的的函数表示的Haskell:

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 = concat [g y | y <- f x] 

正是这种成分是通过列表单子拍摄,让你写:

h x = f x >>= g 

甚至

h = f >=> g 
+1

非常感谢。其他地方我没有这么清楚地解释过。 – andro 2014-12-03 09:17:21