问题标签 [strictness]

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 回答
958 浏览

haskell - P. Wadler 论文的“The Strictness Monad”中的“⊥”是什么意思?

有人可以帮我理解 Wadler 题为“理解单子”的论文中的以下定义吗?(摘自第 3.2 节/第 9 页,即“Strictness Monad”小节。)


有时有必要控制惰性函数程序中的评估顺序。这通常通过可计算函数strict来实现,定义为

严格 f x = 如果x ≠ ⊥ 那么f x else ⊥。

在操作上,通过首先将x减少为弱头范式 (WHNF) 然后减少应用程序f x来减少严格的 f x。或者,并行减少xf x是安全的,但在x处于 WHNF 中之前不允许访问结果。


在论文中,我们还没有看到使用由两条垂直线组成的符号(不确定它叫什么),所以它有点不知从何而来。

鉴于 Wadler 继续说“我们将使用 [严格] 推导来控制惰性程序的评估”,这似乎是一个需要理解的非常重要的概念。

0 投票
1 回答
621 浏览

haskell - BangPatterns 可以出现在哪里

GHC 用户指南看来,大多数Pat都可以PBangPat,但也有一些例外。例如,模块中的顶级刘海(如!main)是不允许的,并且x : !xs无法解析 x : (!xs) parses感谢@chi。关于可以在哪里添加刘海的正式规范是什么?我查看了用户指南和报告的一些章节,但一无所获。

0 投票
2 回答
601 浏览

haskell - 数据定义中的严格可能

我看过很多演讲/阅读博客文章,您应该有严格的字段data以避免各种性能问题,例如:

这对我来说完全有意义。由于对该数据的函数操作是惰性的,因此不会牺牲可组合性。

但是,如果我添加一个Maybe字段:

我在数据结构中引入了惰性,毕竟Maybe是一个控制结构。未评估的 thunk 不能隐藏在Just构造函数后面吗?

但是,有严格Maybe的 in strictor thru strict-base-types。但是根据反向依赖(strictstrict-base-types),它们并没有被广泛使用。

那么问题来了:为什么应该或不应该Maybe在非控制数据定义中使用严格?

0 投票
1 回答
397 浏览

haskell - Haskell wikibook 中无可辩驳/懒惰的模式练习

到这里一半...

https://en.wikibooks.org/wiki/Haskell/Laziness

...是一个练习,询问更改head使用无可辩驳的模式的功能的替代实现的影响。它提供了如下定义,注意由于第一个方程的无可辩驳的匹配head',它总是会返回:undefined

然后它问:

  • 为什么不改变方程的顺序来head'帮助这里?
  • 如果将第一个等式更改为使用普通的可反驳模式,那么 的行为head'仍然会与 的行为不同head吗?如果是这样,怎么做?

在 GHC 7.8.4 中,似乎更改顺序“有助于”至少使该函数的行为类似于 的常规部分版本head,尽管在空列表情况下有不同的例外。在我看来,第二个问题的答案是“否”,但考虑到“如果是这样,如何”附录,感觉我在这里也必须遗漏一些东西。任何人都可以启发我吗?不幸的是,页面上的解决方案链接不包括此练习。

0 投票
2 回答
220 浏览

haskell - IO monad防止嵌入式mapM短路?

下面的代码有点神秘。在问题的非玩具版本中,我试图在 monad Result 中进行 monadic 计算,其值只能从 IO 中构造。似乎 IO 背后的魔力使此类计算变得严格,但我无法弄清楚这是如何发生的。

编码:

输出:

0 投票
0 回答
174 浏览

haskell - 在 Haskell 中避免 CAF

为了避免 CAF(资源共享),我尝试使用虚拟参数转换为函数,但没有成功(noCafB)。我已经阅读了如何在 Haskell 中制作 CAF 而不是 CAF?如此尝试noCafCnoCafD。使用 编译时 -O0,每次都会评估具有虚拟参数的函数。但是,-O2GHC 似乎将这些函数转换为 CAF。这是预期的行为(GHC 的优化)吗?

结果与-O2

结果与-O0

我也试过没有,trace但结果是一样的。在下-O2,我发现incInt函数的结果是通过检查分析输出来共享的。为什么会有这种行为?

任何意见将不胜感激。谢谢。

0 投票
1 回答
281 浏览

haskell - 映射严格与惰性函数

当 f 严格时,它适用于每个 xs 列表。谁能给我举个例子,为什么使用非严格的 f 它不起作用?

0 投票
1 回答
370 浏览

haskell - 什么时候在 Haskell 中使用“严格通配符”有用,它有什么作用?

我正在查看一些 Haskell 源代码并遇到了与 的模式匹配!_,代码在这里:http ://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.List.html#unsafeTake

我真的不明白“严格通配符”是如何工作的,以及为什么它对这个函数(或任何其他函数)有用。

0 投票
1 回答
1304 浏览

haskell - Haskell 的 seq 是如何使用的?

因此,Haskellseq函数强制评估它的第一个参数并返回第二个参数。因此它是一个中缀运算符。如果你想强制评估一个表达式,直觉上这样的特性将是一个一元运算符。所以,而不是

这将是

因此,如果您想要的值是a,为什么要返回b以及如何构造b. 显然,我不是在考虑 Haskell。:)

0 投票
2 回答
109 浏览

haskell - 是评估还是$!足以在多线程单子上下文中强制执行值,还是我需要 pseq?

以下似乎有效(如:它Surely tomorrow每秒都在说)

这用于evaluate确保last [0..]在填充之前实际上强制 WHFN MVar- 如果我将分叉线程更改为

然后程序终止。

但是,evaluate使用seq. 在确定性并行的上下文中,总是强调这seq不足以真正保证评估顺序。这个问题不会出现在单子上下文中,还是我应该更好地使用

以确保编译器不能重新排序评估因此tryTakeMVar过早成功?