[Haskell] foldr与foldl

1. foldr定义

foldr f z (x : xs) = f x (foldr f z xs) 
foldr f _ [] = _  

例子:

foldr + 0 [1 2]
= + 1 (foldr + 0 [2])
= + 1 (+ 2 (foldr + 0 []))
= + 1 (+ 2 0)
= 3

2. foldl定义

foldl f z (x : xs) = foldl f (f z x) xs 
foldl f _ [] = _ 

例子:

foldl + 0 [1 2]
= foldl + (+ 0 1) [2]
= foldl + (+ (+ 0 1) 2) []
= + (+ 0 1) 2
= 3

3. 使用foldr定义foldl

foldl f v xs = foldr (\x g -> (\a -> g (f a x))) id xs v

注:
(1)可以使用一个temp函数简化定义,

foldl f v xs = foldr temp id xs v
    where temp x g = \a->g (f a x)

(2)Currying以后还可以写为,

foldl f v xs = foldr temp id xs v
    where temp x g a = g (f a x)

例子:

foldl + 0 [1 2]
= foldr temp id [1 2] 0

 foldr temp id [1 2]
= temp 1 (foldr temp id [2])
= temp 1 (temp 2 (foldr temp id []))
= temp 1 (temp 2 id)
= temp 1 (\a->id (+ a 2))
= temp 1 (\a->+ a 2)
=\a->(\a->+ a 2) (+ a 1)
=\a->+ (a + 1) 2

foldr temp id [1 2] 0
=(\a->+ (a + 1) 2) 0
=+ (0 + 1) 2
=3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,034评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,956评论 19 139
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,696评论 0 4
  • 原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,...
    JackChen1024阅读 11,331评论 1 17
  • 时隔七年,第一次回到母校,独自漫步在熟悉的石阶,大学四年,能翻出时间围栏的记忆真的很少。同学一句话,道出了其...
    清泉之源阅读 3,165评论 0 0

友情链接更多精彩内容