pseq可以用seq来定义吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pseq可以用seq来定义吗?相关的知识,希望对你有一定的参考价值。
据我所知,seq a b
在返回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
)?
答案
答案似乎是“不,至少没有额外的魔力”。
这个问题
xseq a b = (seq a id) b
是编译器可以看到seq a id
的结果是id
,这在任何地方都是严格的。如果函数是严格的,则允许函数应用程序首先计算参数,因为这样做不会改变表达式的语义。因此,优化编译器可以首先开始评估b
,因为它知道它最终将需要它。
以上是关于pseq可以用seq来定义吗?的主要内容,如果未能解决你的问题,请参考以下文章