关于Haskell中的'pseq'

时间:2012-10-12 05:20:03

标签: haskell parallel-processing ghc

考虑以下两个陈述:

(a `par` b) `pseq` (a + b)

a `par` (b `pseq` (a + b))

有人可以解释他们的行为如何彼此不同吗?

对于第一个,如果主线程完成了计算b但火花计算a尚未完成,主线程是否会继续计算a + b

1 个答案:

答案 0 :(得分:12)

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的后果不精确,没有其他差异可以从语言定义中发现。相反,在您的特定编译器/运行时,它们可能会做稍微不同的事情。