问题标签 [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.
vim - 当文件中有折叠时,gvim 自动显示折叠列
我知道你可以使用
启用折叠列
但是有没有办法仅在文件中存在折叠时自动打开它?
recursion - 为什么在 Racket 中以一种奇怪的方式定义 foldl?
在 Haskell 中,就像在许多其他函数式语言中一样,函数foldl
被定义为,例如,foldl (-) 0 [1,2,3,4] = -10
.
这没关系,因为foldl (-) 0 [1, 2,3,4]
根据定义,((((0 - 1) - 2) - 3) - 4)
.
但是,在 Racket 中,(foldl - 0 '(1 2 3 4))
是 2,因为 Racket “智能地”计算如下:(4 - (3 - (2 - (1 - 0))))
,这确实是 2。
当然,如果我们定义辅助函数flip,像这样:
那么我们可以在 Racket 中实现与在 Haskell 中相同的行为:而不是(foldl - 0 '(1 2 3 4))
我们可以编写:(foldl (flip -) 0 '(1 2 3 4))
问题是:为什么foldl
在球拍中以如此奇怪(非标准和非直观)的方式定义,与任何其他语言不同?
f# - F# '+' 运算符重载和 List.fold
我正在尝试在为 定义运算符重载的记录类型上使用 List.fold +
,但是在尝试将(+)
运算符用作传递给 fold 的 lambda 时出现类型不匹配错误。这是一个简化的片段,可以说明我的问题:
过+
载工作得很好
但是说我有一个人名单:
我不能使用 List.fold 来总结所有年龄:
我猜问题是 F# 无法识别+
以这种方式传递时的重载,因为 fold 隐式键入列表,int
因为我使用 '0' 作为累加器。我不确定是否有可能让我的自定义运算符重载正常工作,如果可能的话,我缺少什么来实现它。(我假设可以使这项工作成为可能,因为您可以+
在花车上使用)。
编辑
我知道问题是类型不匹配。正如 JaredPar 所写,我知道我可以编写一个 lambda 来获取两个人的记录并添加年龄。那不是我的意思。问题是,在我看来,应该有一种方法可以让+
我已经写过的运算符重载被 fold 确认为有效的重载。
另一个编辑
感谢大家的意见。越来越清楚的一件事是,不可能做我想做的事,但这没关系。我学到了一些东西!我所看到的是,运算符重载的分辨率使得它们不能在每个上下文中工作——所以fold
没有无缝的方法可以让+
作为 lambda 传递的工作就像用作中缀 ala 时那样工作jen + kevin
。为什么这不起作用是完全有道理的。人们建议解决这个问题的解决方案基本上是一次性处理特定问题的fold
——我真正追求的是如何获得正确的运算符重载以在每种情况下都被选中(即foldback
等)——我不想写一堆特殊情况的代码来处理列表。很明显,F# 的运算符重载解决方案有一些限制,使其工作到肤浅的水平,这很好。
haskell - Haskell 有 foldlM' 吗?
一个人如何严格地折叠一个单子? Data.Foldable
有严格foldl'
的和一元的foldlM
,但没有严格的foldlM'
?单子本身是否以某种方式定义了严格性?如果是这样,如何确定它是什么?
想象一下,我必须确定大量环元素的乘积是否为零,但我的环不是整数域,即它包含零除数。在这种情况下,我应该递归地foldl
将我的乘法***
拖到列表上,但False
在乘积变为零的那一刻返回,而不是等待完整的乘积。
我也许可以使用Maybe
monad稍微简化此代码,foldlM
但这样做似乎缺乏所需的严格性。
scala - 建议在多个值上优化简单的 Scala foldLeft?
我正在从 Java 到 Scala 重新实现一些代码(一个简单的贝叶斯推理算法,但这并不重要)。我想以尽可能高性能的方式实现它,同时通过尽可能避免可变性来保持代码的清洁和功能。
以下是 Java 代码片段:
很简单,对吧?所以我决定第一次尝试使用 Scala foldLeft 和 map 方法。因为我有两个值要累积,所以累加器是一个元组:
不幸的是,这段代码的执行速度比 Java 慢了大约 5 倍(使用简单且不精确的度量;只是在循环中调用了 10000 次代码)。一个缺陷非常明显;我们遍历列表两次,一次在 map 调用中,另一次在 foldLeft 中。所以这是一个遍历列表一次的版本。
这个更好!它的性能比 Java 代码差大约 3 倍。我的下一个预感是,在折叠的每个步骤中创建所有新元组可能都会涉及一些成本。所以我决定尝试一个遍历列表两次但不创建元组的版本。
这与以前的版本大致相同(比 Java 版本慢 3 倍)。并不奇怪,但我充满希望。
所以我的问题是,有没有更快的方法在 Scala 中实现这个 Java 代码片段,同时保持 Scala 代码干净,避免不必要的可变性并遵循 Scala 习语?我确实希望最终在并发环境中使用此代码,因此保持不变性的价值可能超过单线程中较慢的性能。
haskell - 树折叠操作?
我在 Haskell 上一门课,我们需要为定义的树定义折叠操作:
我似乎找不到任何关于“tfold”操作的信息或它应该做什么。任何帮助将不胜感激。
list - Haskell,将函数应用于列表中的每个项目
嘿还有另一个haskell问题我有一个f类型的函数 :: CSP -> 赋值 -> Var -> Int -> CSP
我想用类型写一个函数
g :: CSP -> 赋值 -> Var -> [Int] -> CSP
它将原始函数应用于列表中的所有元素[Int]
。它传递的CSP
应该在每次f
应用时更新,Assigment
将与Var
. 我很确定我需要使用折叠,但我真的不明白它们。如果有人可以帮助我并尝试解释折叠,我将非常感激。
python - Haskell 的 foldi/foldt 是否存在于 Python 中?
我知道与 Haskell 的 foldl 等效的 python reduce,但我找不到与 Haskell 的 foldi/foldt Link_to_haskell_fold_examples类似的东西