簡體   English   中英

Haskell:seq,par,rseq,rpar簽名

[英]Haskell: seq, par, rseq, rpar signatures

我試圖理解Haskell中的並行性,我好奇的一件事是seq / rseqpar / rpar之間的簽名差異

seq :: a -> b -> b
par :: a -> b -> b

rseq :: a -> Eval a
rpar :: a -> Eval a

我知道rseqrparrpar版本,因此它們帶有Eval部分。 但是為什么seqpar都不都是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 不會評估其參數,它只是在ab之間引入依賴關系:每當將b評估為WHNF時,也會對a進行評估。

par以相同的方式執行此操作:只要對b求值, a 就會被並行求值。

這種語義是為什么seq aa和因此seq a無用的原因。 同樣,允許seq直接評估a會破壞純度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM