问题标签 [fold]

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 投票
1 回答
699 浏览

scala - 是否有 foldLeft 和 for-yield 的组合?

我必须处理订单序列(这里Int为简化起见):

由于一个所谓的

函数我得到另一个类的序列(这里Double是为了简化)。

从这里我实现了两个版本。

版本 1(foldLeft 和显式构建器):

版本 2(var 和用于 yield builder):

我想在版本 1 中保存显式构建器或var在版本 2 中保存可变构建器。

这可能吗?也许结合foldLeftfor- yield

还有一些示例数据:

结果nextGroup处理为Seq[Double],所以VectorList没有区别。

0 投票
2 回答
1263 浏览

haskell - foldl 是否比它严格的表亲 foldl' 更可取?

Haskell 有两个用于列表的左折叠函数:foldl和一个“严格”版本,foldl'. 非严格的问题foldl在于它构建了一个 thunk 塔:

这会浪费内存,如果列表中的项目太多,可能会导致堆栈溢出。 foldl',另一方面,在每个项目上强制累加器。

但是,据我所知,foldl'语义上等同foldl. 评估foldl (+) 0 [1..5]头部正常形式需要在某个点强制累加器。如果我们不需要一个 head-normal 形式,我们就不会foldl (+) 0 [1..5]开始评估。

是否有任何令人信服的理由想要 的 行为foldl超过 的foldl'

0 投票
2 回答
947 浏览

haskell - 折叠、函数组合、单子和惰性,哦,天哪?

我很困惑。我可以这样写:

输出是1。这是有道理的,因为它简化为:

但如果我使用一种模糊相似的单子技术,它的工作原理就不一样了:

这命中prelude.Undefined。这很奇怪,因为我希望它会减少:

但是,翻转合成顺序:

确实完成了预期的短路并产生Nothing.

我想比较这两种方法可能是比较苹果和橙子,但你能解释一下区别吗?我认为这f <=< g是 monadic 的类似物f . g,但它们显然不像我想象的那样类似。你能解释一下为什么吗?

0 投票
3 回答
5298 浏览

haskell - 不是 Functor(或不可遍历)的 Foldable 的示例?

实例可能是Foldable某种容器,因此也可能是Functor。确实,

一个Foldable类型也是一个容器(虽然这个类在技术上并不需要Functor,但有趣Foldable的都是Functors)。

那么有没有一个Foldable自然不是 aFunctor或 a的例子Traversable?(也许 Haskell wiki 页面错过了 :-))

0 投票
1 回答
277 浏览

scala - Scala:避免强制转换为 foldLeft 中的类型参数

考虑这个片段定义了模拟状态的特征,用户希望以某种派生类型实现该特征。在 trait 上,实用方法的集合应该能够提供具有实现类型的结果,类似于 Scala 库集合执行此操作的方式。为此,我认为我需要使用实现类型参数化特征,如下所示:

现在我想定义一个多步更新方法,如下所示:

当我尝试天真的方法时:

编译器抱怨类型不匹配:

这是有道理的,因为this在 State 中看到的 具有 State[This] 类型。要编译代码,似乎我必须进行显式转换:

有没有办法避免这种显式转换,或者更普遍地以更好的方式实现预期结果?谢谢。

0 投票
2 回答
2396 浏览

erlang - 打破折叠的简单方法

我需要从 foldl 中解脱出来。这是一个虚拟示例,当我计算列表中值的总和并遇到太大的值(即 10)时如何从折叠中中断

我知道这个例子是人为的,但是有什么好的方法可以打破折叠(我知道折叠总是扫描整个结构)?

请注意,即使我从折叠中中断,我也需要检索正确的数据。在这种情况下,我应该从以前的迭代中获取数据(就像在我的示例中所做的那样)。

0 投票
3 回答
365 浏览

haskell - 列表推导中是否创建了任何中间数据结构

似乎foldr与列表理解进行了某种融合,因此与foldl此示例中的(21mb)相比,它需要更少的内存(11mb)分配

谁能解释一下如何以及为什么?懒惰的评估在这方面也有帮助。

0 投票
4 回答
1411 浏览

scala - 是否可以使用延续来使 foldRight 尾递归?

以下博客文章展示了如何在 F#foldBack中使用延续传递样式进行尾递归。

在 Scala 中,这意味着:

可以通过这样做使尾递归:

不幸的是,对于长列表,我仍然会出现堆栈溢出。循环是尾递归和优化的,但我猜堆栈累积只是移动到继续调用中。

为什么这不是 F# 的问题?有没有办法用 Scala 解决这个问题?

编辑:这里有一些显示堆栈深度的代码:

这打印:

0 投票
1 回答
203 浏览

haskell - 是否有严格评估的功能表示?

我想在 Haskell 中自己实现严格的折叠功能:这可能吗?我读过 Lisp 宏可用于在很大程度上重新定义语言,使您能够在需要时有效地打破功能范式,并将其塑造成个性化的范式,以最整洁的方式完成工作可能的方式。我实际上并不了解 lisp,所以这可能是不正确的。

当您还考虑到在无类型的 lambda 演算中,数据类型被编码为函数时,我开始怀疑任何东西都可以编码为其他任何东西(GEB的精彩著作对此进行了详细讨论)。在这种情况下,表示严格的评估听起来应该很容易。

那么,您将如何在 haskell 中实现以下内容?

我怀疑它与 Monads 和/或继续传递有关。

0 投票
1 回答
960 浏览

vim - 如何在vim中折叠所有段落

我知道“zfap”命令,它可以折叠一个段落。

但是我怎样才能折叠所有段落?有没有神奇的命令可以完成这项工作?

我搜索“全局”命令,但“全局”似乎只适用于行模式,我怎样才能在所有段落中一一做某事?