fp in scala 学习随记(1)

Foldright foldleft
先来看一下foldleft的一个简单定义

@annotation.tailrec
deffoldLeft[A,B](as:List[A],z:B)(f:(B,A)=>B):B = as match{
case Nil=> z
case Cons(h,t) =>foldLeft(t,f(z,h))(f)
}

尾递归版本foldleft,每次把第一个h与z进行f运算然后递归调用foldleft

Foldright很多情况下不是尾递归的,我们要改写成尾递归形式
使用尾递归的foldleft来实现foldright

def foldRight1[A,B](as: List[A], z: B)(f: (A, B) => B): B = {
foldLeft(reverse(as), z)((b, a) => f(a, b))
}
def foldRight2[A,B](as: List[A], z: B)(f: (A, B) => B): B = {
foldLeft(as, (b: B) => b) ((g, a) => b =>g(f(a, b))) (z)
}

第一个里面使用的是通过foldleft来实现的一个reverse函数

defreverse(ns:List[A]):List[A] = {
foldLeft(ns,List[A]())((acc,h)=>Cons(h,acc))
}

很简单,略过
第二个函数就不是很好懂了,我们来把它拆开
改写一下定义:

def foldRight3[A,B](as: List[A], outerIdent: B)(combiner: (A, B)=> B): B =

我们不需要直接build出 B 的value,因此我们使用了一个函数 BtoB:B=>B fold的过程需要 a:A 和一个函数 g: B=>B.
因此我们有了一个新函数

(b => g(f(a,b))): B=>B.

我们可以把fold过程写成这样:

As.foldLeft(identity _)((g, a) => g compose (b => f(a, b)))(z)

我们来看一下这个语句:对于 as 中的所有元素 a,我们部分施用 b=> f (b,a),这个函数是个B=>B类型的。然后我们将函数复合一下:
(g, a) => b => g(f(a, b)). 最后把这整个的函数应用到z上,就是

 ((g, a)=> b => g(f(a, b))) (z)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值