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