7得票2回答
为什么foldr可以接受带有三个参数的函数?

我在研究一些列表操作时遇到了 !!: (!!) :: [a] -> Int -> a xs !! n | n < 0 = negIndex | otherwise = foldr (\x r k -> case k...

7得票2回答
Haskell repa - 如何减少数组并返回索引?

在GNU Octave中,这段代码为 - [e, ix] = min(X); 将返回最小元素及其位置。 如何在repa中使用任意二进制函数实现此功能? 以下是我想到的方法: min x = z $ foldl' f (e,0,0) es where (e:es) = to...

55得票3回答
函数式编程、Scala的map和fold left

有哪些关于fold left的好教程? 原始问题,已从删除状态恢复以提供其他答案的上下文: 我正在尝试实现一种方法来查找矩形、圆形、位置和组的边界框,这些都扩展自Shape。组基本上是一组形状的数组。abstract class Shape case class Rectangle(w...

202得票3回答
缩减、折叠还是扫描(左/右)?

何时应该使用reduceLeft、reduceRight、foldLeft、foldRight、scanLeft或scanRight? 我想要一个它们之间差异的直觉/概述-可能包括一些简单的例子。

73得票5回答
在一个无限列表上进行左折叠和右折叠

我对Learn You A Haskell的以下段落有疑问(我认为这是一本很好的书,不是在贬低它): 其中一个重要的区别是右折叠可以处理无限列表,而左折叠不行!简单地说,如果你从右边开始对一个无限列表进行折叠,最终会到达列表的开头。然而,如果你从左边开始对一个无限列表进行折叠,你永远也无法到...

41得票2回答
任意可调用的折叠表达式?

我看了一下关于C++17折叠的paper(和cppreference),对于为什么选择只使用运算符,我感到困惑。乍一看,似乎只需在args元素之间插入一个+标记就可以轻松扩展(... + args),但我不确定这是个好决定。 为什么不能像上面那样使用二进制lambda表达式并进行相同的扩展呢...

171得票7回答
foldr和foldl(或foldl')的含义及影响。

首先,我正在阅读的《Real World Haskell》指出永远不要使用foldl,而是使用foldl',因此我相信它。 但是我对何时使用foldr和foldl'感到模糊。虽然我可以看到它们的不同工作结构,但我太蠢了,不理解哪个“更好”。我想对我来说似乎并不重要使用哪个,因为它们都会产生相...

16得票2回答
`foldl`的实际应用

今天我在编写一个小脚本时,我使用了foldl而不是foldl'。结果我遭受了stack overflow,所以我导入了Data.List (foldl')并对此感到高兴。这就是我使用foldl的默认工作流程。当惰性版本无法求值时,只需使用foldl'。 Real World Haskell认...

110得票4回答
你如何知道何时使用fold-left和何时使用fold-right?

我知道fold-left会生成左倾树,而fold-right会生成右倾树,但是当我需要使用fold时,有时会陷入令人头痛的思考中,试图确定哪种类型的fold是合适的。通常情况下,我会将整个问题解开,并逐步通过fold函数的实现来解决我的问题。 因此,我想知道: - 有哪些经验法则可以确定何...

7得票1回答
懒惰的foldRight早期终止混淆

在阅读《Scala函数式编程》时,我遇到了下面的代码片段: def foldRight[A](z: => B)(f: (A,=>B) => B):B = uncons match { case Some((h,t)) => f(h,t.foldRight(z)(f...