标签: fold

Scala中foldLeft和reduceLeft之间的区别

我已经学会了foldLeft和之间的基本区别reduceLeft

foldLeft:

  • 初始值必须通过

reduceLeft:

  • 将集合的第一个元素作为初始值
  • 如果集合为空,则抛出异常

还有其他区别吗?

有两种方法具有相似功能的任何特定原因?

functional-programming scala fold higher-order-functions

191
推荐指数
5
解决办法
6万
查看次数

缩小,折叠或扫描(左/右)?

什么时候应该使用reduceLeft,reduceRight,foldLeft,foldRight,scanLeftscanRight

我想要一个直觉/概述他们的差异 - 可能有一些简单的例子.

reduce scala fold scala-collections

177
推荐指数
3
解决办法
7万
查看次数

foldr与foldl(或foldl')的含义

首先,我正在阅读的真实世界Haskell表示永远不会使用foldl而是使用foldl'.所以我相信它.

但我对什么时候使用foldrvs. 朦胧foldl'.虽然我可以看到他们如何以不同的方式摆放在我面前的结构,但是当"哪个更好"时,我太愚蠢了.我想在我看来似乎并不重要,因为它们都产生相同的答案(不是吗?).事实上,我以前使用这个结构的经验来自Ruby inject和Clojure reduce,它们似乎没有"左"和"右"版本.(附带问题:他们使用哪个版本?)

任何有助于像我这样的智能挑战的洞察力都会非常感激!

recursion haskell functional-programming fold

150
推荐指数
7
解决办法
3万
查看次数

foldl与具有无限列表的foldr行为

此问题中 myAny函数的代码使用foldr.当谓词满足时,它会停止处理无限列表.

我用foldl重写了它:

myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldl step False list
   where
      step acc item = p item || acc
Run 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)

haskell combinators lazy-evaluation fold

115
推荐指数
3
解决办法
2万
查看次数

折叠与减少之间的区别?

试图学习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)

reduce f# functional-programming fold

115
推荐指数
4
解决办法
3万
查看次数

什么是'pythonic'相当于函数式编程的'fold'函数?

在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实现这一目的的惯用方法?

python reduce functional-programming list fold

108
推荐指数
6
解决办法
8万
查看次数

你怎么知道何时使用fold-left以及何时使用fold-right?

我知道fold-left会产生左倾的树木,右倾的树木产生右倾的树木,但是当我伸手去拿折叠时,我有时会发现自己陷入了引发头痛的想法,试图确定哪种折叠是合适的.我通常最终会解决整个问题并逐步执行fold函数,因为它适用于我的问题.

所以我想知道的是:

  • 确定是向右折叠还是向右折叠有哪些经验法则?
  • 考虑到我面临的问题,我如何快速决定使用哪种类型的折叠?

Scala by Example(PDF)中有一个示例,它使用折叠编写一个名为flatten的函数,该函数将元素列表列表连接成一个列表.在这种情况下,右侧折叠是正确的选择(考虑到列表连接的方式),但我必须考虑一下才能得出结论.

由于折叠是(功能)编程中的常见操作,因此我希望能够快速,自信地做出这些决策.所以...任何提示?

language-agnostic functional-programming fold

98
推荐指数
4
解决办法
2万
查看次数

Kotlin中fold和reduce之间的基本区别是什么?什么时候用哪个?

我正在阅读Kotlin的基础知识,我对Kotlin中的函数fold()和reduce()非常困惑,有人能给我一个区分两者的具体例子吗?

reduce fold kotlin

96
推荐指数
5
解决办法
3万
查看次数

函数式编程中的reduce和foldLeft/fold之间的区别(特别是Scala和Scala API)?

为什么Scala和像Spark和Scalding这样的框架都有reducefoldLeft?那么reduce和之间的区别是fold什么?

reduce functional-programming scala fold scalding

93
推荐指数
2
解决办法
3万
查看次数

使用foldr编写foldl

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)

recursion haskell fold

73
推荐指数
4
解决办法
1万
查看次数