我一直在想这个,但我一直无法找到它.
使用该seq功能时,它是如何真正起作用的?在任何地方,只是解释说seq a b评估a,丢弃结果并返回b.
但是,是什么真正意味着什么?以下结果将严格评估:
foo s t = seq q (bar q t) where
q = s*t
Run Code Online (Sandbox Code Playgroud)
我的意思是,q在使用之前是否经过严格评估bar?以下是相同的:
foo s t = seq (s*t) (bar (s*t) t)
Run Code Online (Sandbox Code Playgroud)
我觉得有点难以详细说明这个功能的功能.
我从真实世界的 Haskell 中读到
它的操作如下:当一个
seq表达式被求值时,它会强制求值它的第一个参数,然后返回它的第二个参数。它实际上对第一个参数没有任何作用:seq仅作为强制评估该值的一种方式存在。
我在那里强调了then因为对我来说它意味着两件事发生的顺序。
从Hackage我读到
seq a b如果a是底部,则的值是底部,否则等于b。换句话说,它将第一个参数评估a为弱头部范式(WHNF)。seq 通常用于通过避免不必要的懒惰来提高性能。关于求值顺序的注意事项:表达式
seq a b不保证a会在 之前求值b。by 给出的唯一保证seq是两者a和b将在seq返回值之前进行评估。特别是,这意味着b可以在 之前进行评估a。[…]
此外,如果我# Source从那里点击链接,页面不存在,所以我看不到seq.
这似乎与此答案下的评论一致:
[…]
seq不能在普通的 Haskell 中定义
另一方面(或在同一方面,真的),另一条评论写道:
“真实”
seq在 GHC.Prim 中定义为seq :: a -> b -> b; …
haskell functional-programming lazy-evaluation order-of-execution weak-head-normal-form
我理解seq函数以及为什么有必要引入严格的效率。我不明白的是,为什么这个原语被称为seq(而不是与严格有关)?