首页 > 解决方案 > 使用 foldr 定义追加

问题描述

我已经看到可以通过append这种方式在 Haskell 中定义函数

append :: [a] -> [a] -> [a]
append = flip (foldr (:))

我正在寻找有关其工作原理的解释。我的主要问题是我不知道如何foldr将列表作为参数。不过,对整个实现的完整解释会很好。

标签: haskell

解决方案


foldr需要三个参数:一个累加器函数、一个初始累加器值和一个列表(嗯,一个可折叠的)。

foldr (:)因此,需要另外两个参数:初始累加器和列表。

这里所做的是巧妙地使用两个列表之一作为初始累加器。

然后,对于另一个列表中的每个元素,将其合并到初始列表中;这导致另一个列表中的所有元素都附加到初始列表中。

基本上,append [1,2,3] [4,5,6]这里相当于foldr (:) [4,5,6] [1,2,3],最终做(1:(2:(3:[4,5,6]))),导致[1,2,3,4,5,6]


推荐阅读