请考虑以下两个陈述:
(a `par` b) `pseq` (a + b)
和
a `par` (b `pseq` (a + b))
有人可以解释他们的行为是如何彼此不同的吗?
对于第一个,如果主线程完成了计算 b
但火花计算 a
尚未完成,主线程将继续计算 a + b
?
请考虑以下两个陈述:
(a `par` b) `pseq` (a + b)
和
a `par` (b `pseq` (a + b))
有人可以解释他们的行为是如何彼此不同的吗?
对于第一个,如果主线程完成了计算 b
但火花计算 a
尚未完成,主线程将继续计算 a + b
?
par a b
在语义上等同于 b
,但它提示了开始评估可能有用 a
早。另一方面 pseq
强制评估它的第一个参数,但它只是第二个参数中的(懒惰)身份函数。
所以,
(a `par` b) `pseq` (a + b)
在语义上等同于
b `pseq` (a + b)
这相当于
a `par` (b `pseq` (a + b))
两者都说“评价 b
然后成为thunk a + b
“。鉴于后果的不精确性 par
没有其他差异可以从语言定义中发现。相反,在您的特定编译器/运行时,它们可能会做稍微不同的事情。