![](/img/trans.png)
[英]When are rpar and rseq expressions actually computed in Haskell program?
[英]Haskell: seq, par, rseq, rpar signatures
我試圖理解Haskell中的並行性,我好奇的一件事是seq
/ rseq
和par
/ rpar
之間的簽名差異
seq :: a -> b -> b
par :: a -> b -> b
rseq :: a -> Eval a
rpar :: a -> Eval a
我知道rseq
和rpar
是rpar
版本,因此它們帶有Eval
部分。 但是為什么seq
和par
都不都是seq
a -> a
呢? 有點像嚴格的身份...“復雜”的原因應該存在。
seq
似乎也有很多神秘之處。 有消息說a
當評估b
評估(以WHNF)。 其他消息來源說a
是在通話時評估的。 真是令人困惑! 盡管可以通過實際測試來測試某些東西,但恐怕我很容易誤解結果。
已經有a -> a
嚴格的類型a -> a
的函數,即id
。 Haskell是非嚴格的,因此調用函數的唯一原因是您需要函數的結果,因此,在調用id y
時,您需要該值。 以類似的方式,當調用seq xy
是因為您需要該值。
在Haskell中未指定seq
的操作語義,這可能就是為什么您覺得它神秘的原因。 pseq
是更容易理解的功能。 pseq
函數將其第一個參數評估為WHNF,然后返回其第二個參數。 seq
函數可能與pseq
相同,但也可能不同。 它由它的指稱語義定義(Haskell報告中的第6.2節):
seq ⊥ b = ⊥
seq a b = b, if a /= ⊥
由此可以得出結論,兩個參數中seq
都是嚴格的。 對於嚴格的函數,調用者很可能會評估參數,因為這不會造成語義差異。 因此,在調用seq
,調用者可以按任意順序評估參數的任何組合。
簡而言之, seq
不會評估其參數,它只是在a
和b
之間引入依賴關系:每當將b
評估為WHNF時,也會對a
進行評估。
par
以相同的方式執行此操作:只要對b
求值, a
就會被並行求值。
這種語義是為什么seq aa
和因此seq a
無用的原因。 同樣,允許seq
直接評估a
會破壞純度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.