簡體   English   中英

pseq 可以用 seq 來定義嗎?

[英]Can pseq be defined in terms of seq?

據我所知, seq ab評估板(力) ab返回前b 它不保證首先評估a

pseq ab首先評估a ,然后評估/返回b

現在考慮以下幾點:

xseq a b = (seq a id) b

函數應用程序需要先評估左操作數(以獲得 lambda 形式),並且不能在進入函數之前盲目評估右操作數,因為這會違反 Haskell 的非嚴格語義。

因此(seq a id) b必須首先評估seq a id ,這會強制aid (以某種未指定的順序(但評估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.

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