Questions tagged «fold»

在函数式程序设计中,折叠(也称为还原,累积或分解)是一种高阶函数,它递归地将变换应用于数据结构,将其“折叠”为汇总值



7
folder vs.foldl(或foldl')的含义
首先,我正在阅读的Real World Haskell说永远不要使用foldl,而是使用foldl'。所以我相信。 但我在朦胧时使用foldr对foldl'。尽管我可以看到它们摆在我面前的方式各不相同,但我还是很愚蠢,无法理解何时“哪个更好”。我想在我看来,使用哪个并不重要,因为它们都产生相同的答案(不是吗?)。实际上,我以前使用此构造的经验来自Ruby inject和Clojure的reduce,它们似乎没有“ left”和“ right”版本。(旁问:他们使用哪个版本?) 任何能帮助像我这样的聪明人挑战的见解将不胜感激!


4
带有无限列表的foldl与foldr行为
此问题中 myAny函数的代码使用文件夹。当满足谓词时,它将停止处理无限列表。 我用foldl重写了它: myAny :: (a -> Bool) -> [a] -> Bool myAny p list = foldl step False list where step acc item = p item || acc (请注意,step函数的参数正确颠倒了。) 但是,它不再停止处理无限列表。 我试图按照Apocalisp的回答来跟踪函数的执行: myAny even [1..] foldl step False [1..] step (foldl step False [2..]) 1 even 1 || (foldl step …

4
折叠和缩小之间的区别?
尝试学习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])

9
函数式编程中的“ pythonic”等同于“ fold”函数是什么?
在Haskell中,实现以下目标的最惯用的方法是: foldl (+) 0 [1,2,3,4,5] --> 15 或等效的Ruby: [1,2,3,4,5].inject(0) {|m,x| m + x} #> 15 显然,Python提供了reduce与fold完全相同的功能,但实际上是如上所述的fold的实现,但是,有人告诉我,“ pythonic”编程方式是避免使用lambda术语和高阶函数,并尽可能使用列表理解。因此,有没有一种首选的方式来折叠列表或不是Python reduce函数的类似列表的结构,或者是reduce惯用的方式来实现此目的?

4
您如何知道何时使用左折和何时使用右折?
我知道向左折叠会产生向左倾斜的树木,向右折叠会产生向右倾斜的树木,但是当我伸手折叠时,有时会发现自己陷入了头痛的想法,试图确定哪种折叠方式是适当的。我通常最终会解决整个问题,并逐步解决适用于我的问题的fold函数的实现。 所以我想知道的是: 确定是左折还是右折的经验法则是什么? 考虑到我面临的问题,如何快速决定使用哪种折叠类型? Scala by Example(PDF)中有一个示例,该示例使用折叠来编写一个称为flatten的函数,该函数将元素列表的列表连接为一个列表。在这种情况下,正确的选择是正确的选择(考虑到列表的合并方式),但是我必须仔细考虑一下才能得出结论。 由于折叠是(功能)编程中的常见操作,因此我希望能够快速而自信地做出此类决定。那么...有什么提示吗?


9
使用foldr编写foldl
在真实世界的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) 上面的代码使我很困惑,有人叫dps用有意义的名字重写了它,使它更清晰: myFoldl stepL zeroL xs = (foldr stepR id xs) zeroL where …

7
foldl是尾递归的,那么foldr如何比foldl运行得更快?
我想测试foldl vs foldr。从我所看到的情况来看,由于尾部递归优化,您应该在可能的情况下使用foldl over foldr。 这很有道理。但是,运行此测试后,我感到困惑: 文件夹(使用时间命令时需要0.057s): a::a -> [a] -> [a] a x = ([x] ++ ) main = putStrLn(show ( sum (foldr a [] [0.. 100000]))) foldl(使用time命令时需要0.089s): b::[b] -> b -> [b] b xs = ( ++ xs). (\y->[y]) main = putStrLn(show ( sum (foldl b [] [0.. …

10
文件夹如何工作?
谁能解释foldr工作原理? 请看以下示例: Prelude> foldr (-) 54 [10, 11] 53 Prelude> foldr (\x y -> (x+y)/2) 54 [12, 4, 10, 6] 12.0 我对这些处决感到困惑。有什么建议?

5
在无限列表上左右折叠
我对“了解您的Haskell”(很棒的书imo,不要轻描淡写)中的以下文章有疑问: 一个很大的不同是,右折叠在无限列表上起作用,而左折叠则不行!简而言之,如果您在某个时间点取一个无限的列表,然后将其从右侧折叠起来,最终您将到达列表的开头。但是,如果您在某个点取一个无限的列表,然后尝试将其从左向上折叠,那么您将永远无法结束! 我就是不明白这一点。如果您获取一个无限列表,然后尝试从右侧将其折叠起来,那么您将不得不从无穷大的那一点开始,这只是没有发生(如果有人知道您可以使用的语言,请告诉:p )。至少,您必须根据Haskell的实现从那里开始,因为在Haskell foldr和foldl中,不需要使用确定在列表中应该从何处开始折叠的参数。 我同意报价单iff foldr和foldl的参数确定了它们应该在列表中的何处开始折叠,因为有意义的是,如果您从无限的列表开始并从已定义的索引开始折叠,它将最终终止,而实际上不管你从左折开始 您将向无限折叠。但是,foldr和foldl不接受此参数,因此引号没有意义。在Haskell中,无限列表上的左折和右折都不会终止。 我的理解正确吗?还是我缺少什么?

3
折叠后无需后处理步骤,是否可以实现此文字功能?
《真实世界》 Haskell,印刷版的第98页第4章询问是否words可以使用折叠实现,这也是我的问题: 可能吗?如果没有,为什么?如果是,怎么办? 我基于以下想法提出了以下想法:每个非空格都应该放在输出列表中的最后一个单词之前(这发生在otherwise防护中),并且空格应该触发将空值单词附加到输出列表,如果没有一个已经(这是在处理if- - )。thenelse myWords :: String -> [String] myWords = foldr step [[]] where step x yss@(y:ys) | x == ' ' = if y == "" then yss else "":yss | otherwise = (x:y):ys 显然,此解决方案是错误的,因为输入字符串中的前导空格会导致输出字符串列表中的一个前导空字符串。 在上面的链接中,我研究了为其他读者准备的几种解决方案,其中许多解决方案与我的解决方案相似,但是它们通常对折页的输出进行“后处理”,例如通过折叠tail处理是一个空的前导字符串。 其他方法使用元组(实际上仅是成对的),以便对折处理成对的并可以很好地处理前导/尾随空间。 在所有这些方法中,foldr(或另一种折衷方式)并不是开箱即用地提供最终输出的功能。总有其他东西必须以某种方式调整输出。 因此,我回到最初的问题,询问是否实际上可以words使用折叠实现(以某种方式正确处理尾随/前导/重复的空格)。通过使用折叠,我的意思是折叠功能必须是最外面的功能: myWords :: String -> [String] myWords input …

3
某人写下这样的foldlM定义需要什么知识或培训?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 7个月前关闭。 最近,我试图在我的一些实际案例制作系统中使用Haskell。Haskell类型系统确实为我提供了很大的帮助。例如,当我意识到我需要某种类型的功能时 f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b 实际上有类似的功能foldM,foldlM和foldrM。 但是,真正令我震惊的是这些功能的定义,例如: foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b foldlM f …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.