你会写seq xx吗?

dsp*_*pyz 9 haskell lazy-evaluation

关于seq如何在Haskell中运行,我并不完全清楚.

似乎有很多情况下写它会很有用

seq x x
Run Code Online (Sandbox Code Playgroud)

甚至可能定义一个函数:

strict x = seq x x
Run Code Online (Sandbox Code Playgroud)

但是这样的功能还不存在,所以我猜这种方法在某种程度上是错误的.有人能告诉我这是否有意义或有用吗?

Dan*_*Dan 18

seq a b返回值b,但是该值取决于评估a.因此,seq a a完全相同a.

我认为这里的误解是seq不采取任何行动,因为纯函数不采取行动,它只是引入了依赖.

有一个功能evaluate :: a -> IO (),Control.Exception你做了什么(注意它在里面IO).他们将它置于异常中,因为查看表达式的求值是否会抛出是有用的,如果是,则处理异常.


Mat*_*hid 8

表达式x = seq a b意味着if x被评估,然后a也将被评估(但x将等于b).

并不意味着"评估a现在".

请注意,如果x正在评估,那么从x等于b,那么b也将被评估.

因此,如果我写x = seq a a,我说"如果x评估然后评估a".但是,如果我这样做x = a,那将达到完全相同的目的.


Sne*_*tel 5

seq x x 将是完全的,非常多余的.

请记住,seq不是命令.的存在seq a b在你的程序不强制评估ab它所做,是它使结果的评价人工依赖的评价a,即使结果本身b.如果你打印出来seq a b,a进行评估,并将其结果丢弃..因为x已经取决于自己,seq x x是愚蠢的.


kqr*_*kqr 5

当你说出seq a b你告诉电脑的是什么时,

无论何时你需要评估,请为我b评估a.

如果我们更换两者abx你一起,你可以看出为什么写它是无用的seq x x:

无论何时你需要评估,请为我x评估x.

要求计算机评估x何时需要评估x只是一件无用的事情 - 它x无论如何都会进行评估!

seq没有评估什么-它只是告诉计算机,当你需要的第二个参数,也是评估的第一个参数.理解这一点实际上非常重要,因为它可以让您更好地理解程序的行为.