问题标签 [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 - 数据类型中严格字段的优势
这现在可能有点模糊,但我一直想知道这一点。据我所知!
,可以确保在构造值之前评估数据构造函数的参数:
我经常认为懒惰是一件好事。现在,当我浏览源代码时,我看到的严格字段比!
-less 变体更频繁。
这样做有什么好处,为什么我不应该让它保持懒惰呢?
haskell - 仅使用 Functor 而非 Monad 的严格 fmap
最近对惰性 IO 的一种刺激引起了我的注意
由于惰性 IO,上述程序不打印任何内容。所以我想这可以通过严格版本的fmap
. 事实上,我确实想出了这样一个组合器:
替换<$>
为<$!>
确实可以缓解问题。然而,我并不满意。<$!>
有Monad
约束,感觉太紧了;它的同伴<$>
只需要Functor
.
有没有办法不受约束地<$!>
写Monad
?如果是这样,怎么做?如果不是,为什么不呢?我试过在所有地方都严格要求,但无济于事(以下代码无法按预期工作):
haskell - 调试不需要的严格性?
我有一个问题,我不知道如何推理。我正要问是否有人可以帮助我解决具体问题,但我突然意识到我可以问一个更笼统的问题,并希望因此得到更好的总体理解。希望。所以这里是:
当您的程序太懒惰时,这通常很明显,因为您最终会遇到诸如空间泄漏之类的明显问题。我有相反的问题:我的程序太严格了。我正在尝试打结 ,并发现我尝试做的某些事情会以某种方式击败我需要的懒惰。所以我的一般问题是,如何调试不需要的严格性?
为了完整起见,这是我的具体情况:我在 中RWS
,编写器组件填充地图,阅读器组件观察该地图的最终状态。在完成填充之前,我不能对这张地图做任何严格的事情。在地图中查找值似乎没有问题,例如:
但是(!)
使用失败error
,我宁愿使用我的 monad 失败fail
。所以我想做如下的事情:
这导致我的程序<<loop>>
,我不明白。在我看来,这似乎不应该比 using 更严格(!)
,但显然我错了......
performance - 分析 Haskell 程序
我有一段代码使用sequence
. 从道德上讲,它做了这样的事情:
除了它有点复杂。我感兴趣的实际代码是likelihoodWeighting
这个Github repo中的函数。
我注意到运行时间与n
. 特别是一旦n
超过某个值,就会达到内存限制,运行时间就会爆炸。我不确定,但我认为这是因为sequence
正在建立一个长长的 thunk 列表,直到调用sum
.
一旦我超过了大约 100,000 个样本,程序就会慢下来。我想对此进行优化(我的感觉是 1000 万个样本不应该成为问题)所以我决定对其进行分析 - 但我在理解分析器的输出时遇到了一些麻烦。
剖析
我在一个文件中创建了一个简短的可执行文件,该文件main.hs
使用 100,000 个样本运行我的函数。这是做的输出
我注意到的第一件事 - 它分配了近 1.5 GB 的堆,并将 60% 的时间用于垃圾收集。这通常表明过于懒惰吗?
以下是来自的结果
第一次运行时,发现有一个函数被重复调用,结果我可以记住它,这使速度提高了 2 倍。然而,它并没有解决空间泄漏问题。
这是一个堆配置文件。我不知道为什么它声称运行时间是 1.8 秒——这次运行大约需要 6 秒。
谁能帮我解释分析器的输出 - 即确定瓶颈在哪里,并就如何加快速度提供建议?
haskell - Control.Parallel.Strategies 中 Eval 的绑定运算符如何严格评估其参数?
Control.Parallel.Strategies 的源代码 ( http://hackage.haskell.org/packages/archive/parallel/3.1.0.1/doc/html/src/Control-Parallel-Strategies.html#Eval ) 包含一个类型 Eval定义为:
它具有以下 Monad 实例:
注意绑定定义中的注释。为什么这个评论是真的?我对严格性的理解是,一个函数只有在它必须“了解”它的参数时才是严格的。在这里,bind 只是将 k 应用于 x,因此(对我而言)似乎不需要了解有关 x 的任何信息。此外,评论表明在模式匹配中“诱导”了严格性,甚至在定义函数之前。有人可以帮我理解为什么绑定是严格的吗?
此外,看起来 Eval 只是身份 Monad,并且鉴于 bind 定义中的注释,对于几乎所有 Monad,bind 都是严格的。是这样吗?
haskell - 遗漏一些严格的东西
我有这个代码:
然后,我想用严格的参数调用函数;我试过了:
和
但它并没有表现得好像它有严格的论点:即在“开始”之后我必须等待评估(divisors 12345678)
我错过了什么?
haskell - 不确定如何获得正确的评估顺序
我不确定这两段代码之间的区别是什么(相对于x
),但第一个完成:
而第二个没有(至少在 GHCi 中):
我做错了什么,阻止了第二个例子在它命中时完成x == 4
,就像第一个例子一样?
我已经尝试在 thex
和x == 4
(inside a let
) 中添加爆炸模式,但似乎都没有什么不同。
lazy-evaluation - haskell中严格版本的含义是什么?
关注<Real World Haskell>,据说 foldl'
是严格版的foldl
。
但是我很难理解,是什么strict
意思?
performance - Haskell foldl'(++)性能不佳
我有这个代码:
这些函数返回每个元素乘以 2 的列表:
在 ghci 中:
为什么newList_bad
函数的工作速度比 慢 200 倍newList_good
?我知道这不是该任务的好解决方案。但是为什么这个无辜的代码工作得这么慢呢?
这是什么“4767099960字节”?对于那个简单的操作,Haskell 使用了 4 GiB?
编译后: