问题标签 [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.
haskell - Haskell 如何评估这个素数函数?
我发现很难理解 Haskell 如何评估这个primes
函数。函数是否primes
被一遍又一遍地评估,或者函数primes
中的primeFactors
将指向第一个primes
?
haskell - Haskells 弱头范式
我偶然发现了一些恼人的事情。我知道 haskell 适用于弱头范式(WHNF),我知道这是什么。在 ghci 中键入以下代码(据我所知,我正在使用命令 :sprint 将表达式简化为 WHNF。):
这intlist = _
对我来说完全有意义。
给stringlist = [_,_]
这已经让我感到困惑了。但是之后:
出人意料地给charlist = ["hi","there"]
据我了解 Haskell,字符串只不过是字符列表,这似乎可以通过检查类型"hi" :: [Char]
和['h','i'] :: [Char]
.
我很困惑,因为根据我的理解,上面所有三个示例都或多或少相同(列表列表),因此应该减少到相同的 WHNF,即_。我错过了什么?
谢谢
haskell - seq 在 Haskell 中实际上做了什么?
从我读到的真实世界的 Haskell
它的操作如下:当一个
seq
表达式被计算时,它强制计算它的第一个参数,然后返回它的第二个参数。它实际上对第一个参数没有任何作用:seq
仅作为强制评估该值的一种方式而存在。
我强调了then因为对我来说它意味着两件事发生的顺序。
从Hackage我读到
seq a b
如果是底部,则的值为a
底部,否则等于b
。换句话说,它评估a
弱头范式(WHNF)的第一个参数。seq
通常引入它是为了通过避免不必要的惰性来提高性能。关于评估顺序的说明:表达式
seq a b
不保证a
将在b
. 唯一的保证seq
是两者都a
将b
在seq
返回值之前进行评估。特别是,这意味着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 ,例如?b
b
a
seq a (a + x)
haskell - 来自 Simon Marlow 的《Haskell 中的并行和并发编程》一书中的严格评估示例
Simon Marlow 在他的《Haskell 中的并行和并发编程》一书中写道:
插入操作有这一行:
这会将未计算的表达式放在 MVar 中
Map.insert name number book
。如果我们要连续执行许多插入操作,MVar 将建立一个大的未计算表达式链。为了获得短暂的锁定并且没有空间泄漏,我们需要使用一个技巧:使用这个序列,我们在 MVar 中存储了一个未计算的表达式,但它在 putMVar 之后立即被计算。
我不明白。操作以弱头范式seq a b
进行评估。a
所以会有未评估的表达。正如我所看到的,只有 Map 构造函数将被评估,并且它的所有内容都将被取消评估。