qdd*_*dpx 11 parallel-processing haskell ghc
请考虑以下两个陈述:
(a `par` b) `pseq` (a + b)
Run Code Online (Sandbox Code Playgroud)
和
a `par` (b `pseq` (a + b))
Run Code Online (Sandbox Code Playgroud)
有人可以解释他们的行为如何彼此不同吗?
对于第一个,如果主线程已完成计算b但火花计算a尚未完成,主线程是否会继续计算a + b?
Phi*_* JF 12
par a b在语义上是等价的b,但它给出了提示,即开始a早期评估可能是有用的.另一方面pseq强制评估它的第一个参数,但它只是第二个参数中的(懒惰)身份函数.
所以,
(a `par` b) `pseq` (a + b)
Run Code Online (Sandbox Code Playgroud)
在语义上等同于
b `pseq` (a + b)
Run Code Online (Sandbox Code Playgroud)
这相当于
a `par` (b `pseq` (a + b))
Run Code Online (Sandbox Code Playgroud)
因为他们都说"评估b然后成为thunk a + b".鉴于par没有其他差异的后果不精确可以从语言定义中发现.相反,在您的特定编译器/运行时,它们可能会做稍微不同的事情.
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |