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).他们将它置于异常中,因为查看表达式的求值是否会抛出是有用的,如果是,则处理异常.
表达式x = seq a b意味着if x被评估,然后a也将被评估(但x将等于b).
它并不意味着"评估a现在".
请注意,如果x正在评估,那么从x等于b,那么b也将被评估.
因此,如果我写x = seq a a,我说"如果x评估然后评估a".但是,如果我这样做x = a,那将达到完全相同的目的.
seq x x 将是完全的,非常多余的.
请记住,seq是不是命令.的存在seq a b在你的程序不强制评估a或b它所做,是它使结果的评价人工依赖的评价a,即使结果本身b.如果你打印出来seq a b,a进行评估,并将其结果丢弃..因为x已经取决于自己,seq x x是愚蠢的.
当你说出seq a b你告诉电脑的是什么时,
无论何时你需要评估,请为我
b评估a.
如果我们更换两者a并b与x你一起,你可以看出为什么写它是无用的seq x x:
无论何时你需要评估,请为我
x评估x.
要求计算机评估x何时需要评估x只是一件无用的事情 - 它x无论如何都会进行评估!
seq并没有评估什么-它只是告诉计算机,当你需要的第二个参数,也是评估的第一个参数.理解这一点实际上非常重要,因为它可以让您更好地理解程序的行为.
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |