[英]Can pseq be defined in terms of seq?
據我所知, seq ab
評估板(力) a
和b
返回前b
。 它不保證首先評估a
。
pseq ab
首先評估a
,然后評估/返回b
。
現在考慮以下幾點:
xseq a b = (seq a id) b
函數應用程序需要先評估左操作數(以獲得 lambda 形式),並且不能在進入函數之前盲目評估右操作數,因為這會違反 Haskell 的非嚴格語義。
因此(seq a id) b
必須首先評估seq a id
,這會強制a
和id
(以某種未指定的順序(但評估id
什么都不做)),然后返回id b
(即b
); 因此xseq ab
計算a
之前b
。
是xseq
的有效實施pseq
? 如果沒有,上面的論點有什么問題(是否有可能根據seq
來定義pseq
)?
答案似乎是“不,至少不是沒有額外的魔法”。
問題在於
xseq a b = (seq a id) b
就是編譯器可以看到seq a id
的結果是id
,到處都是嚴格的。 如果函數是嚴格的,則允許函數應用程序首先評估參數,因為這樣做不會改變表達式的語義。 因此優化編譯器可以首先開始評估b
因為它知道它最終會需要它。
可以根據
seq
定義pseq
嗎?
在 GHC 中 - 是的。
正如 Alec 所指出的,您還需要 mirror-smoke lazy
:
-- for GHC 8.6.5
import Prelude(seq)
import GHC.Base(lazy)
infixr 0 `pseq`
pseq :: a -> b -> b
pseq x y = x `seq` lazy y
與 GHC 來源中的對應定義相匹配的定義; 進口是非常不同的。
對於其他 Haskell 實現,這可能有效:
import Prelude(seq)
infixr 0 `pseq`
pseq :: a -> b -> b
pseq x y = x `seq` (case x of _ -> y)
可能與 - 至少 - 相當於:
-- for GHC 8.6.5
{-# NOINLINE pseq #-}
我會讓 melpomene 決定這是否也符合鏡像煙霧的條件...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.