2012-10-12 51 views
11

考慮以下兩個語句:關於在Haskell 'PSEQ'

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

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

有人能解釋他們的行爲彼此有何不同?

對於第一個,如果主線程已經完成計算b但火花計算a尚未完成,主線程是否會繼續計算a + b

回答

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的後果不準確,語言定義中不會有其他區別。相反,在您的特定編譯器/運行時,它們可能會做些微不同的事情。