haskell - 使用 foldr 定义追加
问题描述
我已经看到可以通过append
这种方式在 Haskell 中定义函数
append :: [a] -> [a] -> [a]
append = flip (foldr (:))
我正在寻找有关其工作原理的解释。我的主要问题是我不知道如何foldr
将列表作为参数。不过,对整个实现的完整解释会很好。
解决方案
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]
推荐阅读
- opengl - 获取 Vulkan 的 XVisualInfo
- wordpress - 如何动态更新 WordPress post_meta
- android-studio - Android Studio 3.6 仅在第二次运行时应用更改
- python-3.x - ValueError: int() 以 10 为底的无效文字:'' [NOT A FLOAT]
- spring-boot - Spring-boot我如何使用球衣消费XML RPC服务器
- amazon-web-services - Amazon Lex:在 Lambda 初始化中使用委托将永远不会返回错误处理
- python - 如何创建包含 gpiozero 的可执行文件?
- javascript - React Drag and Drop 不起作用 - 使用先前值渲染两次组件
- python - 列表中重复次数最多的元素
- java - 如何让 Hashmap 为一个键分配多个值?