haskell - Haskell 中的非确定性是什么?

标签 haskell

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

最佳答案

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

也就是说,一个计算f从类型A的输入非确定性地计算类型B的输出然后在Haskell中由一个函数表示将 A 类型的值列表 B 类型的值:

f :: A -> [B]

然后,如果我们也有计算 g,它——同样是非确定性的——根据 B 类型的输入计算 C 类型的输出,

g :: B -> [C]

我们可以组合这些计算以获得组合计算h,它将A类型的输入与C类型的输出相结合:

h :: A -> [C]

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

h x = concat zs where zs = [g y | y <- f x]

正是这种组合被list monad捕获,允许你写:

h x = f x >>= g

甚至

h = f >=> g

关于haskell - Haskell 中的非确定性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27265920/

相关文章:

haskell - 高阶函数的计算复杂性?

layout - Haskell 记录语法

haskell - runST 与 unsafePerformIO 的实际意义

haskell - 使用堆栈设置安装 ghc 时权限被拒绝

具有两个变量的 Haskell 列表理解

haskell - 无限读取文件

haskell - GHC Int 类型的位大小

haskell - 避免 "sharing"的好方法?

haskell - Haskell 中的点管道 ".|"运算符是什么?

haskell - Cabal 多个可执行文件