问题标签 [weak-head-normal-form]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
121 浏览

haskell - Haskell 如何评估这个素数函数?

我发现很难理解 Haskell 如何评估这个primes函数。函数是否primes被一遍又一遍地评估,或者函数primes中的primeFactors将指向第一个primes

0 投票
1 回答
229 浏览

haskell - Haskells 弱头范式

我偶然发现了一些恼人的事情。我知道 haskell 适用于弱头范式(WHNF),我知道这是什么。在 ghci 中键入以下代码(据我所知,我正在使用命令 :sprint 将表达式简化为 WHNF。):

intlist = _对我来说完全有意义。

stringlist = [_,_] 这已经让我感到困惑了。但是之后:

出人意料地给charlist = ["hi","there"]

据我了解 Haskell,字符串只不过是字符列表,这似乎可以通过检查类型"hi" :: [Char]['h','i'] :: [Char].

我很困惑,因为根据我的理解,上面所有三个示例都或多或少相同(列表列表),因此应该减少到相同的 WHNF,即_。我错过了什么?

谢谢

0 投票
3 回答
1259 浏览

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

从我读到的真实世界的 Haskell

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

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

Hackage我读到

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

关于评估顺序的说明:表达式seq a b不保证a将在b. 唯一的保证seq是两者都abseq返回值之前进行评估。特别是,这意味着b可以在 之前进行评估a。[…]

此外,如果我从那里单击# Source链接,则该页面不存在,因此我看不到seq.

这似乎与此答案下的评论一致:

[…]seq不能在普通的 Haskell 中定义

另一方面(或者实际上是同时),另一条评论如下:

“真实”seq在 GHC.Prim 中定义为seq :: a -> b -> b; seq = let x = x in x. 这只是一个虚拟的定义。基本上seq是由编译器特别处理的特殊语法。

任何人都可以对这个话题有所了解吗?特别是在以下方面:

  • 什么来源是对的?
  • seq的实现在 Haskell 中真的不可写吗 ?
    • 如果是这样,它甚至意味着什么?那是原始人吗?这告诉我什么seq实际上做了什么?
  • 至少在使用 的情况下,保证在seq a b之前a评估in ,例如?bbaseq a (a + x)
0 投票
2 回答
59 浏览

haskell - 来自 Simon Marlow 的《Haskell 中的并行和并发编程》一书中的严格评估示例

Simon Marlow 在他的《Haskell 中的并行和并发编程》一书中写道:

插入操作有这一行:

这会将未计算的表达式放在 MVar 中Map.insert name number book。如果我们要连续执行许多插入操作,MVar 将建立一个大的未计算表达式链。为了获得短暂的锁定并且没有空间泄漏,我们需要使用一个技巧:

使用这个序列,我们在 MVar 中存储了一个未计算的表达式,但它在 putMVar 之后立即被计算。

我不明白。操作以弱头范式seq a b进行评估。a所以会有未评估的表达。正如我所看到的,只有 Map 构造函数将被评估,并且它的所有内容都将被取消评估。