gpt4 book ai didi

function - 使用折叠插入

转载 作者:行者123 更新时间:2023-12-02 17:11:19 24 4
gpt4 key购买 nike

有人可以解释一下如何使用 Fold 编写 intercalate 函数吗?此外,我听说过 foldrfoldl;其中哪一个最适合在这种情况下使用?

这是我的递归尝试:

intercalate :: [a] -> [[a]] -> [a]
intercalate s [] = []
intercalate s [x] = x
intercalate s (x:xs) = x ++ s ++ (intercalate s xs)

最佳答案

使用foldr1:

intercalate' :: [a] -> [[a]] -> [a]
intercalate' _ [] = []
intercalate' x xs = foldr1 (\a acc -> a ++ x ++ acc) xs

这将在每个元素之间使用 x 插入右侧的值。 (尽管它这样做 lazily 。–直到需要时才会评估整个折叠。)

foldr1foldr 的相似之处在于它们都是从右侧折叠。区别在于前者不要求我们提供最终期限,而后者则需要提供最终期限。这需要我们对空列表进行模式匹配,否则会抛出异常。

事实上,foldl1也可以实现插层。但是,强烈建议不要这样做,因为左侧折叠会急切地消耗输入。

intercalate' :: [a] -> [[a]] -> [a]
intercalate' _ [] = []
intercalate' x xs = foldl1 (\acc a -> acc ++ x ++ a) xs
<小时/>

为了进一步强调对右折叠的偏好,请考虑以下组合:

take 10 . intercalate' [0] $ repeat [1..3]

看起来无害。但是使用 foldl1 将急切地消耗无限列表,而不是停止该过程。

但是,使用 foldr1 将延迟计算并给出 [1,2,3,0,1,2,3,0,1,2]。 (intercalate' 将临时计算 [1..3]++ [0]++ (foldr (...) [0] [elem1 ... elemN])take 10 之前询问主要术语并评估折叠。)

感谢Will .

有用的阅读:
foldl versus foldr behaviour with infinite lists

关于function - 使用折叠插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55321853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com