问题标签 [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 投票
4 回答
3749 浏览

haskell - 数据类型中严格字段的​​优势

这现在可能有点模糊,但我一直想知道这一点。据我所知!,可以确保在构造值之前评估数据构造函数的参数:

我经常认为懒惰是一件好事。现在,当我浏览源代码时,我看到的严格字段比!-less 变体更频繁。

这样做有什么好处,为什么我不应该让它保持懒惰呢?

0 投票
1 回答
844 浏览

haskell - 仅使用 Functor 而非 Monad 的严格 fmap

最近对惰性 IO 的一种刺激引起了我的注意

由于惰性 IO,上述程序不打印任何内容。所以我想这可以通过严格版本的fmap. 事实上,我确实想出了这样一个组合器:

替换<$><$!>确实可以缓解问题。然而,我并不满意。<$!>Monad约束,感觉太紧了;它的同伴<$>只需要Functor.

有没有办法不受约束地<$!>Monad如果是这样,怎么做?如果不是,为什么不呢?我试过在所有地方都严格要求,但无济于事(以下代码无法按预期工作):

0 投票
1 回答
363 浏览

haskell - 调试不需要的严格性?

我有一个问题,我不知道如何推理。我正要问是否有人可以帮助我解决具体问题,但我突然意识到我可以问一个更笼统的问题,并希望因此得到更好的总体理解。希望。所以这里是:

当您的程序太懒惰时,这通常很明显,因为您最终会遇到诸如空间泄漏之类的明显问题。我有相反的问题:我的程序太严格了。我正在尝试打结 并发现我尝试做的某些事情会以某种方式击败我需要的懒惰。所以我的一般问题是,如何调试不需要的严格性?


为了完整起见,这是我的具体情况:我在 中RWS,编写器组件填充地图,阅读器组件观察该地图的最终状态。在完成填充之前,我不能对这张地图做任何严格的事情。在地图中查找值似乎没有问题,例如:

但是(!)使用失败error,我宁愿使用我的 monad 失败fail。所以我想做如下的事情:

这导致我的程序<<loop>>,我不明白。在我看来,这似乎不应该比 using 更严格(!),但显然我错了......

0 投票
4 回答
3420 浏览

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 秒。

在此处输入图像描述

谁能帮我解释分析器的输出 - 即确定瓶颈在哪里,并就如何加快速度提供建议?

0 投票
1 回答
244 浏览

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 都是严格的。是这样吗?

0 投票
1 回答
91 浏览

haskell - 遗漏一些严格的东西

我有这个代码:

然后,我想用严格的参数调用函数;我试过了:

但它并没有表现得好像它有严格的论点:即在“开始”之后我必须等待评估(divisors 12345678)

我错过了什么?

0 投票
3 回答
118 浏览

haskell - 不确定如何获得正确的评估顺序

我不确定这两段代码之间的区别是什么(相对于x),但第一个完成:

而第二个没有(至少在 GHCi 中):

我做错了什么,阻止了第二个例子在它命中时完成x == 4,就像第一个例子一样?

我已经尝试在 thexx == 4(inside a let) 中添加爆炸模式,但似乎都没有什么不同。

0 投票
4 回答
265 浏览

haskell - rseq/seq 的存在是否破坏了参照透明性?是否有一些替代方法没有?

0 投票
3 回答
956 浏览

lazy-evaluation - haskell中严格版本的含义是什么?

关注<Real World Haskell>,据说 foldl'是严格版的foldl

但是我很难理解,是什么strict意思?

0 投票
3 回答
1197 浏览

performance - Haskell foldl'(++)性能不佳

我有这个代码:

这些函数返回每个元素乘以 2 的列表:

在 ghci 中:

为什么newList_bad函数的工作速度比 慢 200 倍newList_good?我知道这不是该任务的好解决方案。但是为什么这个无辜的代码工作得这么慢呢?

这是什么“4767099960字节”?对于那个简单的操作,Haskell 使用了 4 GiB?

编译后: