问题标签 [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.
scala - 是否有 foldLeft 和 for-yield 的组合?
我必须处理订单序列(这里Int
为简化起见):
由于一个所谓的
函数我得到另一个类的序列(这里Double
是为了简化)。
从这里我实现了两个版本。
版本 1(foldLeft 和显式构建器):
版本 2(var 和用于 yield builder):
我想在版本 1 中保存显式构建器或var
在版本 2 中保存可变构建器。
这可能吗?也许结合foldLeft
和for
- yield
?
还有一些示例数据:
结果nextGroup
处理为Seq[Double]
,所以Vector
或List
没有区别。
haskell - foldl 是否比它严格的表亲 foldl' 更可取?
Haskell 有两个用于列表的左折叠函数:foldl
和一个“严格”版本,foldl'
. 非严格的问题foldl
在于它构建了一个 thunk 塔:
这会浪费内存,如果列表中的项目太多,可能会导致堆栈溢出。 foldl'
,另一方面,在每个项目上强制累加器。
但是,据我所知,foldl'
在语义上等同于foldl
. 评估foldl (+) 0 [1..5]
头部正常形式需要在某个点强制累加器。如果我们不需要一个 head-normal 形式,我们就不会foldl (+) 0 [1..5]
开始评估。
是否有任何令人信服的理由想要 的 行为foldl
超过 的foldl'
?
haskell - 折叠、函数组合、单子和惰性,哦,天哪?
我很困惑。我可以这样写:
输出是1
。这是有道理的,因为它简化为:
但如果我使用一种模糊相似的单子技术,它的工作原理就不一样了:
这命中prelude.Undefined
。这很奇怪,因为我希望它会减少:
但是,翻转合成顺序:
确实完成了预期的短路并产生Nothing
.
我想比较这两种方法可能是比较苹果和橙子,但你能解释一下区别吗?我认为这f <=< g
是 monadic 的类似物f . g
,但它们显然不像我想象的那样类似。你能解释一下为什么吗?
scala - Scala:避免强制转换为 foldLeft 中的类型参数
考虑这个片段定义了模拟状态的特征,用户希望以某种派生类型实现该特征。在 trait 上,实用方法的集合应该能够提供具有实现类型的结果,类似于 Scala 库集合执行此操作的方式。为此,我认为我需要使用实现类型参数化特征,如下所示:
现在我想定义一个多步更新方法,如下所示:
当我尝试天真的方法时:
编译器抱怨类型不匹配:
这是有道理的,因为this
在 State 中看到的 具有 State[This] 类型。要编译代码,似乎我必须进行显式转换:
有没有办法避免这种显式转换,或者更普遍地以更好的方式实现预期结果?谢谢。
erlang - 打破折叠的简单方法
我需要从 foldl 中解脱出来。这是一个虚拟示例,当我计算列表中值的总和并遇到太大的值(即 10)时如何从折叠中中断
我知道这个例子是人为的,但是有什么好的方法可以打破折叠(我知道折叠总是扫描整个结构)?
请注意,即使我从折叠中中断,我也需要检索正确的数据。在这种情况下,我应该从以前的迭代中获取数据(就像在我的示例中所做的那样)。
haskell - 列表推导中是否创建了任何中间数据结构
似乎foldr
与列表理解进行了某种融合,因此与foldl
此示例中的(21mb)相比,它需要更少的内存(11mb)分配
谁能解释一下如何以及为什么?懒惰的评估在这方面也有帮助。
scala - 是否可以使用延续来使 foldRight 尾递归?
以下博客文章展示了如何在 F#foldBack
中使用延续传递样式进行尾递归。
在 Scala 中,这意味着:
可以通过这样做使尾递归:
不幸的是,对于长列表,我仍然会出现堆栈溢出。循环是尾递归和优化的,但我猜堆栈累积只是移动到继续调用中。
为什么这不是 F# 的问题?有没有办法用 Scala 解决这个问题?
编辑:这里有一些显示堆栈深度的代码:
这打印:
haskell - 是否有严格评估的功能表示?
我想在 Haskell 中自己实现严格的折叠功能:这可能吗?我读过 Lisp 宏可用于在很大程度上重新定义语言,使您能够在需要时有效地打破功能范式,并将其塑造成个性化的范式,以最整洁的方式完成工作可能的方式。我实际上并不了解 lisp,所以这可能是不正确的。
当您还考虑到在无类型的 lambda 演算中,数据类型被编码为函数时,我开始怀疑任何东西都可以编码为其他任何东西(GEB的精彩著作对此进行了详细讨论)。在这种情况下,表示严格的评估听起来应该很容易。
那么,您将如何在 haskell 中实现以下内容?
我怀疑它与 Monads 和/或继续传递有关。
vim - 如何在vim中折叠所有段落
我知道“zfap”命令,它可以折叠一个段落。
但是我怎样才能折叠所有段落?有没有神奇的命令可以完成这项工作?
我搜索“全局”命令,但“全局”似乎只适用于行模式,我怎样才能在所有段落中一一做某事?