我已经学会了foldLeft和之间的基本区别reduceLeft
foldLeft:
reduceLeft:
还有其他区别吗?
有两种方法具有相似功能的任何特定原因?
什么时候应该使用reduceLeft,reduceRight,foldLeft,foldRight,scanLeft或scanRight?
我想要一个直觉/概述他们的差异 - 可能有一些简单的例子.
首先,我正在阅读的真实世界Haskell表示永远不会使用foldl而是使用foldl'.所以我相信它.
但我对什么时候使用foldrvs. 朦胧foldl'.虽然我可以看到他们如何以不同的方式摆放在我面前的结构,但是当"哪个更好"时,我太愚蠢了.我想在我看来似乎并不重要,因为它们都产生相同的答案(不是吗?).事实上,我以前使用这个结构的经验来自Ruby inject和Clojure reduce,它们似乎没有"左"和"右"版本.(附带问题:他们使用哪个版本?)
任何有助于像我这样的智能挑战的洞察力都会非常感激!
此问题中 myAny函数的代码使用foldr.当谓词满足时,它会停止处理无限列表.
我用foldl重写了它:
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldl step False list
where
step acc item = p item || accRun Code Online (Sandbox Code Playgroud)
(请注意,步骤函数的参数已正确反转.)
但是,它不再停止处理无限列表.
我试图在Apocalisp的答案中跟踪函数的执行情况:
myAny even [1..]
foldl step False [1..]
step (foldl step False [2..]) 1
even 1 || (foldl step False [2..])
False || (foldl step False [2..])
foldl step False [2..]
step (foldl step False [3..]) 2
even 2 || (foldl step False [3..])
True || (foldl …Run Code Online (Sandbox Code Playgroud) 试图学习F#,但在尝试区分折叠和减少时感到困惑.折叠似乎做同样的事情,但需要额外的参数.是否存在这两种功能存在的合理原因,或者它们是否适合具有不同背景的人?(例如:C#中的字符串和字符串)
以下是从示例中复制的代码段:
let sumAList list =
List.reduce (fun acc elem -> acc + elem) list
let sumAFoldingList list =
List.fold (fun acc elem -> acc + elem) 0 list
printfn "Are these two the same? %A "
(sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])
Run Code Online (Sandbox Code Playgroud) 在Haskell中实现类似以下内容的最惯用方法是什么:
foldl (+) 0 [1,2,3,4,5]
--> 15
Run Code Online (Sandbox Code Playgroud)
或者它在Ruby中的等价物:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Run Code Online (Sandbox Code Playgroud)
显然,Python提供了reduce函数,这是fold的实现,完全如上所述,然而,有人告诉我,'pythonic'编程方式是避免使用lambda术语和高阶函数,在可能的情况下更喜欢列表推导.因此,有没有一种首选的方法来折叠Python中的列表或类似列表的结构,而不是reduce函数,或者是reduce实现这一目的的惯用方法?
我知道fold-left会产生左倾的树木,右倾的树木产生右倾的树木,但是当我伸手去拿折叠时,我有时会发现自己陷入了引发头痛的想法,试图确定哪种折叠是合适的.我通常最终会解决整个问题并逐步执行fold函数,因为它适用于我的问题.
所以我想知道的是:
Scala by Example(PDF)中有一个示例,它使用折叠编写一个名为flatten的函数,该函数将元素列表列表连接成一个列表.在这种情况下,右侧折叠是正确的选择(考虑到列表连接的方式),但我必须考虑一下才能得出结论.
由于折叠是(功能)编程中的常见操作,因此我希望能够快速,自信地做出这些决策.所以...任何提示?
我正在阅读Kotlin的基础知识,我对Kotlin中的函数fold()和reduce()非常困惑,有人能给我一个区分两者的具体例子吗?
为什么Scala和像Spark和Scalding这样的框架都有reduce和foldLeft?那么reduce和之间的区别是fold什么?
在Real World Haskell中,第4章.函数式编程
用foldr写foldl:
-- file: ch04/Fold.hs
myFoldl :: (a -> b -> a) -> a -> [b] -> a
myFoldl f z xs = foldr step id xs z
where step x g a = g (f a x)
Run Code Online (Sandbox Code Playgroud)
上面的代码让我很困惑,有人打电话给dps用一个有意义的名字重写它,使它更清晰:
myFoldl stepL zeroL xs = (foldr stepR id xs) zeroL
where stepR lastL accR accInitL = accR (stepL accInitL lastL)
Run Code Online (Sandbox Code Playgroud)
其他人,Jef G,通过提供一个例子并逐步展示基础机制,做得非常出色:
myFoldl (+) 0 [1, 2, 3]
= (foldR step id [1, 2, …Run Code Online (Sandbox Code Playgroud)