据我所知,seq a b
评估 (forces)a
和b
返回之前b
。它不保证a
首先评估。
pseq a b
首先评估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 a b
进行评估。a
b
是xseq
有效的实现pseq
吗?如果不是,那么上述论点有什么问题(并且是否可以完全定义pseq
)seq
?