问题标签 [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.
haskell - 使用 foldr 实现 zip
我目前正在阅读 Real World Haskell 的第 4 章,我正试图围绕使用 foldr 来实现 foldl。
(这是他们的代码:)
我想我会尝试zip
使用相同的技术来实现,但我似乎没有取得任何进展。甚至可能吗?
haskell - Project Euler 27 上的 C 堆栈溢出
我刚刚开始学习 Haskell,并将阅读书籍和教程与解决 Project Euler 的问题结合起来。我一直坚持问题 27,因为使用以下代码出现“C 堆栈溢出”错误:
欧拉文件
命令窗口
此命令给出欧拉系数 1 和 41(一行 40 个素数)
这个因“C 堆栈溢出”而失败(我想获得问题定义中也提到的系数 -79 和 1601):
请您告诉我,为什么会出现错误以及如何解决?谢谢!
我使用 WinHugs。
haskell - 这些值在这个 haskell 函数中来自哪里?
假设我有以下功能:
的结果sumAll [(1,1),(2,2),(3,3)]
将是12
。
我不明白这些(x,y)
值来自哪里。好吧,我知道它们来自xs
变量,但我不明白如何。我的意思是,在没有 where 关键字的情况下直接执行上面的代码,它会是这样的:
而且我无法理解,在上面的代码中,f
变量和(x,y)
变量如何表示(\(x,y) -> x+y)
lambda 表达式。
recursion - foldr 与 foldl(或 foldl')的含义
首先,我正在阅读的Real World Haskellfoldl
说永远不要使用,而是使用foldl'
. 所以我相信它。
但我不清楚何时使用foldr
vs. foldl'
. 虽然我可以看到它们在我面前展示的不同工作方式的结构,但我太愚蠢了,无法理解什么时候“哪个更好”。我想在我看来,使用哪个并不重要,因为它们都产生相同的答案(不是吗?)。事实上,我之前对这种构造的经验来自 Rubyinject
和 Clojure 的reduce
,它们似乎没有“左”和“右”版本。(附带问题:他们使用哪个版本?)
任何可以帮助像我这样聪明的人的见解将不胜感激!
.net - F# - 按间隔将列表分解为串联的字符串
我有一个电子邮件地址列表,我需要向每个地址发送电子邮件通知。我想一次在 25 个地址块中执行此操作。在像 F# 这样的函数式语言中有什么快速的方法可以将 25 个电子邮件地址“折叠”(连接)在一起……每个电子邮件地址用分号分隔。我知道 .NET 中有 String.Split 方法,但我需要一次连接 25 个。
在 F# 中执行此操作的最优雅方式是什么?
haskell - 为什么这个 Haskell 代码可以成功地处理无限列表?
我有一些 Haskell 代码可以在无限列表上正常工作,但我不明白为什么它可以成功。(我修改了我的原始代码 - 没有处理无限列表 - 以合并来自其他在线代码的内容,突然我发现它可以工作但不知道为什么)。
我对 foldr 的理解是它将遍历列表中的每个项目(也许这种理解是不完整的)。如果是这样,那么“step”函数的措辞应该无关紧要......代码应该无法处理无限循环。
但是,以下工作:
请帮助我理解:为什么?
functional-programming - 请用最简单、最通俗易懂的英语解释“折叠的普遍属性”?
我正在研究“Real World Haskell”,这导致了一个名为“A tutorial on the universality and expressiveness of fold”的免费 PDF 。它表明“折叠”是“通用的”。我正在与他对“普遍”的定义搏斗,并想听听那些已经花时间消化它的人的意见:请用最简单、最通俗易懂的英语解释“折叠的普遍属性”?这个“普遍属性”是什么,为什么它很重要?
谢谢。
haskell - 为什么这第一个 Haskell 函数无法处理无限列表,而第二个代码片段成功处理无限列表?
我有两个 Haskell 函数,这两个函数看起来都与我非常相似。但是第一个对无限列表失败,第二个对无限列表成功。我已经尝试了几个小时来确切地确定这是为什么,但无济于事。
这两个片段都是 Prelude 中“单词”功能的重新实现。两者都适用于有限列表。
这是不处理无限列表的版本:
这是处理无限列表的版本:
注意:“charIsSpace”只是对 Char.isSpace 的重命名。
以下解释器会话说明第一个对无限列表失败,而第二个成功。
编辑:感谢下面的回复,我相信我现在明白了。这是我的结论和修改后的代码:
结论:
- 我第一次尝试的最大罪魁祸首是两个以“step space []”和“step char []”开头的方程。将 step 函数的第二个参数与 [] 匹配是不可以的,因为它强制评估整个第二个参数(但需要在下面解释一个警告)。
- 有一次,我认为 (++) 可能会比 cons 更晚地评估它的右手参数,不知何故。所以,我想我可以通过将“= (char:x):xs”更改为“= [char:x] ++ xs”来解决这个问题。但那是不正确的。
- 在某一时刻,我认为将第二个 arg 与 (x:xs) 匹配的模式会导致该函数在无限列表中失败。我几乎是对的,但并不完全正确!正如我在上面的模式匹配中所做的那样,针对 (x:xs) 评估第二个 arg将导致一些递归。它会“转动曲柄”,直到碰到“:”(又名“缺点”)。如果这从未发生过,那么我的函数将无法针对无限列表成功。但是,在这种特殊情况下,一切正常,因为我的函数最终会遇到一个空格,此时会出现“cons”。并且通过匹配 (x:xs) 触发的评估将停在那里,避免无限递归。此时,“x”将被匹配,但 xs 仍将是一个 thunk,所以没有问题。(感谢 Ganesh 真正帮助我理解这一点)。
- 一般来说,您可以随意提及第二个 arg,只要您不强制评估它。如果你匹配了 x:xs,那么你可以随意提及 xs,只要你不强制评估它。
所以,这是修改后的代码。我通常尽量避免 head 和 tail,仅仅因为它们是偏函数,也因为我需要练习编写模式匹配等价物。
这对无限列表正确有效。请注意,看不到头、尾或 (++) 运算符。
现在,有一个重要的警告: 当我第一次编写更正的代码时,我没有与“step_[]”匹配的第三个等式。结果,我收到了有关非详尽模式匹配的警告。显然,避免该警告是个好主意。
但我以为我会遇到问题。我已经在上面提到过,将第二个 arg 与 [] 进行模式匹配是不行的。但我必须这样做才能摆脱警告。
但是,当我添加“step_[]”等式时,一切都很好!无限列表仍然没有问题!. 为什么?
因为从未达到更正代码中的第三个等式!
事实上,考虑以下 BROKEN 版本。它与正确的代码完全相同,只是我将空列表的模式移到了其他模式之上:
我们回到堆栈溢出,因为调用 step 时发生的第一件事是解释器检查第一个等式是否匹配。为此,它必须查看第二个参数是否为 []。为此,它必须评估第二个参数。
将方程向下移动到其他方程的下方可确保永远不会尝试第三个方程,因为第一个或第二个模式总是匹配。第三个等式只是为了省去非详尽的模式警告。
这是一次很棒的学习经历。感谢大家的帮助。
haskell - 这是编写 Haskell foldr 函数的正确方法吗?
我在YAHT 的 Recursive Datatype部分做练习,发现编写listFoldr
函数有点挑战性(主要是因为我一开始并没有真正理解和之间的区别foldl
)foldr
。当我最终确切地意识到该foldr
函数是如何工作的时,我决定只需简单地交换函数参数即可将我listFoldl
的函数更改为listFoldr
函数:
这似乎有效(我做了比这更多的测试):
但是为练习给出的解决方案与我的大不相同。他们listFoldl
和我的完全一样,但是看看他们的listFoldr
:
哪种解决方案更好,我的还是他们的?其中之一不正确吗?(在我的测试中,它们最终都得到完全相同的结果......)
vim - 在 Vim 中不打开折叠就无法编辑标题
假设您有一个光标位于如图所示的闭合折叠处。
替代文字 http://dl.getdropbox.com/u/175564/foldEdit.png
在 Vim 中,如何在不打开折叠的情况下编辑 SMALLAPPS 的标题?