Haskell 程序员提到非确定性是什么意思?我读到列表 monad 可用于对非确定性建模,但肯定列表不是非确定性的?对非确定性建模意味着什么?据我所知,这只是意味着为一组计算返回一组所有可能的结果。
你的理解是正确的。列表 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)