为什么下面的 Haskell 代码是不确定的?

2024-02-24

我一直在学习 Haskell学习 Haskell http://learnyouahaskell.com/chapters and 刚刚遇到以下声明 http://learnyouahaskell.com/functors-applicative-functors-and-monoids:

Doing (+) <$> [1,2] <*> [4,5,6]结果是不确定的 计算x + y where x取自的每一个值[1,2] and y需要 对每个值[4,5,6].

我认为我不明白这有什么不确定性。难道只是结果的顺序或者计算的顺序不能保证每次都一样吗?


这本书使用的“非确定性计算”的含义与您不同。

您正在思考“非确定性计算”,就像“一个不能完全确定其输出的程序”一样。当使用多个并行执行线程时,这种不确定性很常见;有许多可能的输出,而您得到的输出是由运行时发生的精确顺序任意确定的。

您从 LYAH 引用的段落正在讨论将列表视为“非确定性计算”的模型,从某种意义上说,这是逻辑编程范式的意思(如果您曾经使用 Prolog 语言进行过大量编程,那么您可能对此很熟悉)。从这个意义上说,非确定性程序有多个(或零!)输出因为它们是经过专门编程来这样做的,而不是因为他们没有完全指定他们的输出应该是什么。

如果“非确定性代码”只是具有“零个或多个类型 t 的输出”的代码,那么这听起来很像返回 t 列表的函数。列表 Applicative(以及 Functor 和 Monad)实例只是说明如何将此类“非确定性值”彼此组合以及与纯函数组合的明显方式。例如,Functor 实例表示,如果您可以将函数应用于 A 以获得 B,那么您还可以映射该函数以处理“非确定性 A”以获得“非确定性 B”(通过将未映射的函数应用于“非确定性 A”的每个可能值)。

(+) <$> [1,2] <*> [4,5,6]这种方式是“非确定性加法”的一个例子。将一个可能是 1 或 2 的数字与另一个可能是 4、5 或 6 的数字相加;结果可能是 5、6、7、6、7 或 8(某些可能性会重复,因为生成它们的方法不止一种)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么下面的 Haskell 代码是不确定的? 的相关文章

随机推荐