Haskell --- flod函数中 flodl 和 flodr 与 foldl1 和 foldr1

一个fold取一个二元函数,一个初始值(我喜欢管它叫累加值)和一个需要fold(折叠)的list。这个二元函数有两个参数,即累加值和list的首项(或尾项),返回值是新的累加值。
然后,以新的累加值和新的list首项调用该函数,如是继续。到list遍历完毕时,只剩下一个累加值,也就是最终的结果。

foldl -- 也叫做左折叠。它从list的左端开始折叠,用初始值和list的头部调用这二元函数,得一新的累加值,并用新的累加值与list的下一个元素调用二元函数。

foldr -- 右折叠的行为与左折叠相似,只是累加值是从list的右边开始。

同样,左折叠的二元函数取累加值作首个参数,当前值为第二个参数(即\acc x -> ...),而右折叠的二元函数参数的顺序正好相反(即\x acc -> ...)。这倒也正常,毕竟是从右端开始折叠。

累加值可以是任何类型,可以是数值,布尔值,甚至一个新的list。我们可以用右fold实现map函数,累加值就是个list。将map处理过的元素一个一个连到一起。很容易想到,起始值就是空list。

 

foldl1与foldr1的行为与foldl和foldr相似,只是你无需明确提供初始值。他们假定list的首个(或末尾)元素作为起始值,并从旁边的元素开始折叠。
这一来,sum函数大可这样实现:sum = foldl1 (+)。
这里待折叠的list中至少要有一个元素,若使用空list就会产生一个运行时错误。不过foldl和foldr与空list相处的就很好。
所以在使用fold前,应该先想下它会不会遇到空list,如果不会遇到,大可放心使用foldr1和foldl1。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨鑫newlfe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值