11
考慮以下兩個語句:關於在Haskell 'PSEQ'
(a `par` b) `pseq` (a + b)
和
a `par` (b `pseq` (a + b))
有人能解釋他們的行爲彼此有何不同?
對於第一個,如果主線程已經完成計算b
但火花計算a
尚未完成,主線程是否會繼續計算a + b
?
考慮以下兩個語句:關於在Haskell 'PSEQ'
(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
的後果不準確,語言定義中不會有其他區別。相反,在您的特定編譯器/運行時,它們可能會做些微不同的事情。