问题标签 [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.
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。或者,并行减少x和f x是安全的,但在x处于 WHNF 中之前不允许访问结果。
在论文中,我们还没有看到使用由两条垂直线组成的符号(不确定它叫什么),所以它有点不知从何而来。
鉴于 Wadler 继续说“我们将使用 [严格] 推导来控制惰性程序的评估”,这似乎是一个需要理解的非常重要的概念。
haskell - BangPatterns 可以出现在哪里
从GHC 用户指南看来,大多数Pat
都可以PBangPat
,但也有一些例外。例如,模块中的顶级刘海(如!main
)是不允许的,并且 x : !xs
无法解析x : (!xs) parses
感谢@chi。关于可以在哪里添加刘海的正式规范是什么?我查看了用户指南和报告的一些章节,但一无所获。
haskell - 数据定义中的严格可能
我看过很多演讲/阅读博客文章,您应该有严格的字段data
以避免各种性能问题,例如:
这对我来说完全有意义。由于对该数据的函数操作是惰性的,因此不会牺牲可组合性。
但是,如果我添加一个Maybe
字段:
我在数据结构中引入了惰性,毕竟Maybe
是一个控制结构。未评估的 thunk 不能隐藏在Just
构造函数后面吗?
但是,有严格Maybe
的 in strict
or thru strict-base-types
。但是根据反向依赖(strict,strict-base-types),它们并没有被广泛使用。
那么问题来了:为什么应该或不应该Maybe
在非控制数据定义中使用严格?
haskell - Haskell wikibook 中无可辩驳/懒惰的模式练习
到这里一半...
https://en.wikibooks.org/wiki/Haskell/Laziness
...是一个练习,询问更改head
使用无可辩驳的模式的功能的替代实现的影响。它提供了如下定义,注意由于第一个方程的无可辩驳的匹配head'
,它总是会返回:undefined
然后它问:
- 为什么不改变方程的顺序来
head'
帮助这里? - 如果将第一个等式更改为使用普通的可反驳模式,那么 的行为
head'
仍然会与 的行为不同head
吗?如果是这样,怎么做?
在 GHC 7.8.4 中,似乎更改顺序“有助于”至少使该函数的行为类似于 的常规部分版本head
,尽管在空列表情况下有不同的例外。在我看来,第二个问题的答案是“否”,但考虑到“如果是这样,如何”附录,感觉我在这里也必须遗漏一些东西。任何人都可以启发我吗?不幸的是,页面上的解决方案链接不包括此练习。
haskell - IO monad防止嵌入式mapM短路?
下面的代码有点神秘。在问题的非玩具版本中,我试图在 monad Result 中进行 monadic 计算,其值只能从 IO 中构造。似乎 IO 背后的魔力使此类计算变得严格,但我无法弄清楚这是如何发生的。
编码:
输出:
haskell - 在 Haskell 中避免 CAF
为了避免 CAF(资源共享),我尝试使用虚拟参数转换为函数,但没有成功(noCafB
)。我已经阅读了如何在 Haskell 中制作 CAF 而不是 CAF?如此尝试noCafC
和noCafD
。使用 编译时
-O0
,每次都会评估具有虚拟参数的函数。但是,-O2
GHC 似乎将这些函数转换为 CAF。这是预期的行为(GHC 的优化)吗?
结果与-O2
结果与-O0
我也试过没有,trace
但结果是一样的。在下-O2
,我发现incInt
函数的结果是通过检查分析输出来共享的。为什么会有这种行为?
任何意见将不胜感激。谢谢。
haskell - 映射严格与惰性函数
当 f 严格时,它适用于每个 xs 列表。谁能给我举个例子,为什么使用非严格的 f 它不起作用?
haskell - 什么时候在 Haskell 中使用“严格通配符”有用,它有什么作用?
我正在查看一些 Haskell 源代码并遇到了与 的模式匹配!_
,代码在这里:http ://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.List.html#unsafeTake
我真的不明白“严格通配符”是如何工作的,以及为什么它对这个函数(或任何其他函数)有用。
haskell - Haskell 的 seq 是如何使用的?
因此,Haskellseq
函数强制评估它的第一个参数并返回第二个参数。因此它是一个中缀运算符。如果你想强制评估一个表达式,直觉上这样的特性将是一个一元运算符。所以,而不是
这将是
因此,如果您想要的值是a
,为什么要返回b
以及如何构造b
. 显然,我不是在考虑 Haskell。:)
haskell - 是评估还是$!足以在多线程单子上下文中强制执行值,还是我需要 pseq?
以下似乎有效(如:它Surely tomorrow
每秒都在说)
这用于evaluate
确保last [0..]
在填充之前实际上强制 WHFN MVar
- 如果我将分叉线程更改为
然后程序终止。
但是,evaluate
使用seq
. 在确定性并行的上下文中,总是强调这seq
不足以真正保证评估顺序。这个问题不会出现在单子上下文中,还是我应该更好地使用
以确保编译器不能重新排序评估因此tryTakeMVar
过早成功?