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

haskell - 使用 foldr 实现 zip

我目前正在阅读 Real World Haskell 的第 4 章,我正试图围绕使用 foldr 来实现 foldl

(这是他们的代码:)

我想我会尝试zip使用相同的技术来实现,但我似乎没有取得任何进展。甚至可能吗?

0 投票
2 回答
1319 浏览

haskell - Project Euler 27 上的 C 堆栈溢出

我刚刚开始学习 Haskell,并将阅读书籍和教程与解决 Project Euler 的问题结合起来。我一直坚持问题 27,因为使用以下代码出现“C 堆栈溢出”错误:

欧拉文件

命令窗口

此命令给出欧拉系数 1 和 41(一行 40 个素数)

这个因“C 堆栈溢出”而失败(我想获得问题定义中也提到的系数 -79 和 1601):

请您告诉我,为什么会出现错误以及如何解决?谢谢!

我使用 WinHugs。

0 投票
3 回答
357 浏览

haskell - 这些值在这个 haskell 函数中来自哪里?

假设我有以下功能:

的结果sumAll [(1,1),(2,2),(3,3)]将是12

我不明白这些(x,y)值来自哪里。好吧,我知道它们来自xs变量,但我不明白如何。我的意思是,在没有 where 关键字的情况下直接执行上面的代码,它会是这样的:

而且我无法理解,在上面的代码中,f变量和(x,y)变量如何表示(\(x,y) -> x+y)lambda 表达式。

0 投票
7 回答
38271 浏览

recursion - foldr 与 foldl(或 foldl')的含义

首先,我正在阅读的Real World Haskellfoldl说永远不要使用,而是使用foldl'. 所以我相信它。

但我不清楚何时使用foldrvs. foldl'. 虽然我可以看到它们在我面前展示的不同工作方式的结构,但我太愚蠢了,无法理解什么时候“哪个更好”。我想在我看来,使用哪个并不重要,因为它们都产生相同的答案(不是吗?)。事实上,我之前对这种构造的经验来自 Rubyinject和 Clojure 的reduce,它们似乎没有“左”和“右”版本。(附带问题:他们使用哪个版本?)

任何可以帮助像我这样聪明的人的见解将不胜感激!

0 投票
4 回答
1041 浏览

.net - F# - 按间隔将列表分解为串联的字符串

我有一个电子邮件地址列表,我需要向每个地址发送电子邮件通知。我想一次在 25 个地址块中执行此操作。在像 F# 这样的函数式语言中有什么快速的方法可以将 25 个电子邮件地址“折叠”(连接)在一起……每个电子邮件地址用分号分隔。我知道 .NET 中有 String.Split 方法,但我需要一次连接 25 个。

在 F# 中执行此操作的最优雅方式是什么?

0 投票
4 回答
2628 浏览

haskell - 为什么这个 Haskell 代码可以成功地处理无限列表?

我有一些 Haskell 代码可以在无限列表上正常工作,但我不明白为什么可以成功。(我修改了我的原始代码 - 没有处理无限列表 - 以合并来自其他在线代码的内容,突然我发现它可以工作但不知道为什么)。

我对 foldr 的理解是它将遍历列表中的每个项目(也许这种理解是不完整的)。如果是这样,那么“step”函数的措辞应该无关紧要......代码应该无法处理无限循环。

但是,以下工作:

请帮助我理解:为什么?

0 投票
5 回答
1872 浏览

functional-programming - 请用最简单、最通俗易懂的英语解释“折叠的普遍属性”?

我正在研究“Real World Haskell”,这导致了一个名为“A tutorial on the universality and expressiveness of fold”的免费 PDF 。它表明“折叠”是“通用的”。我正在与他对“普遍”的定义搏斗,并想听听那些已经花时间消化它的人的意见:请用最简单、最通俗易懂的英语解释“折叠的普遍属性”?这个“普遍属性”是什么,为什么它很重要?

谢谢。

0 投票
4 回答
914 浏览

haskell - 为什么这第一个 Haskell 函数无法处理无限列表,而第二个代码片段成功处理无限列表?

我有两个 Haskell 函数,这两个函数看起来都与我非常相似。但是第一个对无限列表失败,第二个对无限列表成功。我已经尝试了几个小时来确切地确定这是为什么,但无济于事。

这两个片段都是 Prelude 中“单词”功能的重新实现。两者都适用于有限列表。

这是不处理无限列表的版本:

这是处理无限列表的版本:

注意:“charIsSpace”只是对 Char.isSpace 的重命名。

以下解释器会话说明第一个对无限列表失败,而第二个成功。

编辑:感谢下面的回复,我相信我现在明白了。这是我的结论和修改后的代码:

结论:

  1. 我第一次尝试的最大罪魁祸首是两个以“step space []”和“step char []”开头的方程。将 step 函数的第二个参数与 [] 匹配是不可以的,因为它强制评估整个第二个参数(但需要在下面解释一个警告)。
  2. 有一次,我认为 (++) 可能会比 cons 更晚地评估它的右手参数,不知何故。所以,我想我可以通过将“= (char:x):xs”更改为“= [char:x] ++ xs”来解决这个问题。但那是不正确的。
  3. 在某一时刻,我认为将第二个 arg 与 (x:xs) 匹配的模式会导致该函数在无限列表中失败。我几乎是对的,但并不完全正确!正如我在上面的模式匹配中所做的那样,针对 (x:xs) 评估第二个 arg导致一些递归。它会“转动曲柄”,直到碰到“:”(又名“缺点”)。如果这从未发生过,那么我的函数将无法针对无限列表成功。但是,在这种特殊情况下,一切正常,因为我的函数最终会遇到一个空格,此时会出现“cons”。并且通过匹配 (x:xs) 触发的评估将停在那里,避免无限递归。此时,“x”将被匹配,但 xs 仍将是一个 thunk,所以没有问题。(感谢 Ganesh 真正帮助我理解这一点)。
  4. 一般来说,您可以随意提及第二个 arg,只要您不强制评估它。如果你匹配了 x:xs,那么你可以随意提及 xs,只要你不强制评估它。

所以,这是修改后的代码。我通常尽量避免 head 和 tail,仅仅因为它们是偏函数,也因为我需要练习编写模式匹配等价物。

这对无限列表正确有效。请注意,看不到头、尾或 (++) 运算符。

现在,有一个重要的警告: 当我第一次编写更正的代码时,我没有与“step_[]”匹配的第三个等式。结果,我收到了有关非详尽模式匹配的警告。显然,避免该警告是个好主意。

但我以为我会遇到问题。我已经在上面提到过,将第二个 arg 与 [] 进行模式匹配是不行的。但我必须这样做才能摆脱警告。

但是,当我添加“step_[]”等式时,一切都很好!无限列表仍然没有问题!. 为什么?

因为从未达到更正代码中的第三个等式!

事实上,考虑以下 BROKEN 版本。它与正确的代码完全相同,只是我将空列表的模式移到了其他模式之上:

我们回到堆栈溢出,因为调用 step 时发生的第一件事是解释器检查第一个等式是否匹配。为此,它必须查看第二个参数是否为 []。为此,它必须评估第二个参数。

将方程向下移动到其他方程的下方可确保永远不会尝试第三个方程,因为第一个或第二个模式总是匹配。第三个等式只是为了省去非详尽的模式警告。

这是一次很棒的学习经历。感谢大家的帮助。

0 投票
4 回答
794 浏览

haskell - 这是编写 Haskell foldr 函数的正确方法吗?

我在YAHT 的 Recursive Datatype部分做练习,发现编写listFoldr函数有点挑战性(主要是因为我一开始并没有真正理解和之间的区别foldlfoldr。当我最终确切地意识到该foldr函数是如何工作的时,我决定只需简单地交换函数参数即可将我listFoldl的函数更改为listFoldr函数:

这似乎有效(我做了比这更多的测试):

但是为练习给出的解决方案与我的大不相同。他们listFoldl和我的完全一样,但是看看他们的listFoldr

哪种解决方案更好,我的还是他们的?其中之一不正确吗?(在我的测试中,它们最终都得到完全相同的结果......)

0 投票
1 回答
178 浏览

vim - 在 Vim 中不打开折叠就无法编辑标题

假设您有一个光标位于如图所示的闭合折叠处。

替代文字 http://dl.getdropbox.com/u/175564/foldEdit.png

在 Vim 中,如何在不打开折叠的情况下编辑 SMALLAPPS 的标题?