Haskell 中的非确定性是什么?

and*_*dro 1 haskell

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

Ste*_*ans 5

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

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

f :: A -> [B]
Run Code Online (Sandbox Code Playgroud)

然后,如果我们也有计算g——也是非确定性的——C从type的输入计算 type 的输出B

g :: B -> [C]
Run Code Online (Sandbox Code Playgroud)

我们可以组合这些计算以获得一个组合计算h,该计算将 type 的输入转换为 typeA的输出C

h :: A -> [C]
Run Code Online (Sandbox Code Playgroud)

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

h x = concat zs where zs = [g y | y <- f x]
Run Code Online (Sandbox Code Playgroud)

列表单子捕获的正是这种组合,允许您编写:

h x = f x >>= g
Run Code Online (Sandbox Code Playgroud)

甚至

h = f >=> g
Run Code Online (Sandbox Code Playgroud)