相关疑难解决方法(0)

seq功能和严格性

我一直在想这个,但我一直无法找到它.

使用该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 strict

40
推荐指数
2
解决办法
6047
查看次数

seq 在 Haskell 中实际上做了什么?

我从真实世界的 Haskell 中读到

它的操作如下:当一个seq表达式被求值时,它会强制求值它的第一个参数,然后返回它的第二个参数。它实际上对第一个参数没有任何作用:seq仅作为强制评估该值的一种方式存在。

我在那里强调了then因为对我来说它意味着两件事发生的顺序。

Hackage我读到

seq a b如果a是底部,则的值是底部,否则等于b。换句话说,它将第一个参数评估a为弱头部范式(WHNF)。seq 通常用于通过避免不必要的懒惰来提高性能。

关于求值顺序的注意事项:表达式seq a b不保证a会在 之前求值b。by 给出的唯一保证seq是两者ab将在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

18
推荐指数
2
解决办法
847
查看次数

为什么引入严格的函数称为 seq?

我理解seq函数以及为什么有必要引入严格的效率。我不明白的是,为什么这个原语被称为seq(而不是与严格有关)?

haskell lazy-evaluation

9
推荐指数
1
解决办法
117
查看次数