scala 函数式编程学习笔记

sealed  trait List[+A]
case object Nil extends  List[Nothing]
case class Cons[+A](head:A,tail:List[A]) extends  List[A]
object List {

  def apply[A](as: A*): List[A] = {
    if (as.isEmpty) Nil
    else Cons(as.head, apply(as.tail: _*))
  }

  def sum(ints: List[Int]): Int = ints match {
    case Nil => 0
    case Cons(x, tail) => x + sum(tail)
  }


  def product(ds: List[Double]): Double = ds match {
    case Nil => 0.0
    case Cons(0.0, _) => 0.0
    case Cons(x, xs) => x * product(xs)
  }

  //删除首位
  def delFist[A](l: List[A]): List[A] = l match {
    case Nil => Nil
    case Cons(_, tail) => tail
  }

  //替换头
  def setHead[A](ag: A, l: List[A]): List[A] = l match {
    case Nil => Cons(ag, Nil)
    case Cons(_, tail) => Cons(ag, tail)
  }

  //删除前几位
  def drop[A](l: List[A], n: Int): List[A] = {
    if (n == 0) l
    else drop(delFist(l), n - 1)
  }


  //删除符合条件的
  def dropWhile[A](l: List[A], condition: A => Boolean): List[A] = l match {
    case Nil => Nil
    case Cons(h, tail) => {
      if (condition(h))
        dropWhile(tail, condition)
      else
        Cons(h, dropWhile(tail, condition))
    }
  }

  def dropWhile2[A](l: List[A])(condition: A => Boolean): List[A] = l match {
    case Cons(h, t) if condition(h) => dropWhile2(t)(condition)
    case _ => l
  }

  def tset(x: Int): Boolean = x >= 5

  // 将addition顺序添加到original前面
  def appendFront[A](original: List[A], addition: List[A]): List[A] = addition match {
    case Nil => original
    case Cons(h, tail) => Cons(h, appendFront(tail, original))
  }

  // 将addition顺序添加到original后面
  def appendBehind[A](original: List[A], addition: List[A]): List[A] = original match {
    case Nil => addition
    case Cons(h, tail) => Cons(h, appendBehind(tail, addition))
  }


  //右折叠 从最右端开始真正的计算
  def foldRight[A, B](as: List[A], z: B)(f: (A, B) => B): B = as match {
    case Nil => z
    case Cons(t, h) => f(t, foldRight(h, z)(f))
    case Cons(t, h) => foldLeft(h, f(t, z))((x, y) => f(y, x)) //使用foldLeft 来实现 foldRight
  }

  //使用右折叠计算链表长度
  def length[A](l: List[A]): Int = l match {
    case Nil => 0
    case Cons(_, t) => foldRight(t, 1)((_, y) => y + 1) //参数对应 这里的下划线对应 t中的某一个元素  y对应1  这里的1是起始数据 后面会跟这进行变化

  }

  //左折叠 从最左端开始真正的计算
  def foldLeft[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)
    case Cons(h, t) => foldRight(t, f(z, h))((x, y) => f(y, x)) //foldRight 来实现foldLeft
  }

  // 使用左折叠 求和 求积 求长度

  def sumLeft(as: List[Int]): Int = as match {
    case Nil => 0
    case Cons(h, t) => foldLeft(t, h)(_ + _) //左折叠 和右折叠在求和时 后面的f基本一致
  }

  def productLeft(as: List[Double]): Double = as match {
    case Nil => 1.0
    case Cons(h, t) => foldLeft(t, h)(_ * _)
  }

  def lengthLeft[A](as: List[A]): Int = as match {
    case Nil => 0
    case Cons(_, t) => foldLeft(t, 1)((x, _) => x + 1)
  }

  //使用fold来进行append

  def appendByFoldRight[A](ori: List[A], adi: List[A]): List[A] = ori match {
    case Nil => adi
    case Cons(_, _) => foldRight(ori, adi)(Cons(_, _)) //这个是遍历 ori将 ori顺序添加到adi前面
  }

  def appendByFoldleft[A](ori: List[A], adi: List[A]): List[A] = adi match {
    case Nil => ori
    case Cons(_, _) => foldRight(adi, ori)(Cons(_, _)) //这个是遍历adi 顺序添加到 ori前面
    //因为Cons 的构造器的原因导致 链表只能向前生长 不能向后添加
  }

  // int ==(int+1)
  def increaseByOne(as: List[Int]): List[Int] = {
    val result:List[Int]=Nil
    as match {
      case Nil => Nil
      case Cons(_, _)=>foldRight(as,result)((x,y)=>Cons(x+1,y))
    }
  }

  //数据类型泛化  例如 List[Int]=>List[String]
def map[A,B](as:List[A])(f:A=>B):List[B]= {
  val res:List[B]=Nil
  as match {
    case Nil => Nil: List[B]
    case Cons(_,_)=>foldRight(as,res)((x,y)=>Cons(f(x),y))
  }
}

  //数据过滤
  def  filter[A](as:List[A])(f:A=>Boolean):List[A]={
    val res:List[A]=Nil
    as match {
      case Nil=>res
      case Cons(t,_) if f(t) =>Cons(t,res)
    }
  }


  //扩展
  def filterMap[A,B](as:List[A])(f:A=>List[B]):List[B]={
    val res:List[B]=Nil
    as match {
      case Nil=> res
      case Cons(_,_)=>foldRight(as,res)((x,y)=>appendBehind(f(x),y))
      case Cons(_,_)=>foldLeft(as,res)((x,y)=>appendBehind(f(y),x))
    }
  }

  //使用filterMap实现filter  搞不出来
  /*def filterByMape[A](as:List[A])(f:A=>Boolean):List[A]={
    filterMap(as)(x=> {if(f(x))Cons(x,Nil)})
  }*/
 // List(1,2,3) List(4,5,6)=>List(5,7,9)
  def zip(as:List[Int],bs:List[Int]):List[Int]=
  {
     as match {
      case Nil=>Nil
      case Cons(h1,t1)=>{
        bs match {
          case Nil=>Nil
          case Cons(h2,t2)=>{
            Cons(h1+h2, zip(t1,t2))
          }
        }
      }
    }
  }

  //数据泛化
  def zipWith[A](as:List[A],bs:List[A])(f:(A,A)=>A):List[A]=
  {
    as match {
      case Nil=>Nil
      case Cons(h1,t1)=>{
        bs match {
          case Nil=>Nil
          case Cons(h2,t2)=>{
            Cons(f(h1,h2), zipWith(t1,t2)(f))
          }
        }
      }
    }
  }


  def main(args: Array[String]): Unit = {
    val x=List(1,2,5,3,4,5)
    val m=x match{
      case Cons(x,Cons(2,Cons(4,_)))=>x
      case Nil=>42
      case Cons(x,Cons(y,Cons(3,Cons(4,_))))=>x+y
      case Cons(h,t)=>h+sum(t)
      case _ =>101}

    //println(m)
    //println(delFist(x))
    //println(dropWhile(x,tset)) //这里面 作为两个独立参数 之间不存在关联关系 所以 无法推导参数类型
    //println(dropWhile2(x)(_>4))  //这里进行柯里化之后 可以进行参数类型的推导

    //println(foldRight(List(1,2,3,4),Nil:List[Int])(Cons(_,_))) //Cons(1,Cons(2,Cons(3,Cons(4,Nil)))) -- 从左向右 依次提取合并
    //println(foldLeft(List(1,2,3,4),Nil:List[Int])((x,y)=>Cons(y,x))) //Cons(1,Cons(2,Cons(3,Cons(4,Nil)))) -- 从左向右 依次提取合并
    //println(lengthLeft(x))
    //println(appendByFoldRight(List(1,2,3),List(4,5,6)))

    //println(increaseByOne(List(1,2,3)))
    //println(filterMap(List(1,2,3))(i=>List(i,i)))

    println(zip(List(1,2,3) ,List(4,5,6)))
  }
  }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Scala函数式编程》是一本非常实用的Scala编程书籍,旨在教读者如何使用Scala编程语言实现函数式编程。该书通过具体的实例和案例来阐述Scala函数式编程的核心概念和技术,包括函数式编程基础、函数的高阶抽象、类型系统、模匹配、并发编程、I/O 和异常处理等方面内容。这些知识点包含了Scala编程语言的重要概念,可以帮助读者深入掌握Scala函数式编程的技术,并在实际应用中运用它们。此外,该书也涵盖了Scala代码风格和整洁性等方面,对编成良好的代码有很大的帮助。总之,这本书对于学习Scala函数式编程的人来说是非常有实践价值的一本书籍。 ### 回答2: Scala函数式编程的PDF是一本非常有价值的学习资料。对于想要深入学习Scala函数式编程的开发者,这本书提供了全面详尽的指导和实践经验,帮助开发者理解函数式编程的核心概念和思想,并将其应用于Scala程序开发中。 该书主要包括以下内容: 1.函数式编程的基本概念和原则,如不可变性、高阶函数、currying、尾递归等等。 2.函数数据结构和算法的实现,包括列表、栈、队列、树、图等等。 3.如何使用Scala语言支持函数式编程的特性,如case class、模匹配、参数化类型、协变和逆变等等。 4.如何使用Scala函数式编程框架,如Akka、Spark等来构建高效的分布应用。 这本书主要适合已经有一定Scala编程基础或者其他函数式编程语言经验的开发者阅读,由于书中的内容较为深入和专业,对于初学者不太友好。但对于有一定基础的Scala开发者来说,该书是一本非常有价值的参考资料,可以帮助他们更深入地理解Scala函数式编程,提高代码质量和开发效率。 ### 回答3: Scala是一种支持函数式编程的编程语言,从而满足了编程语言发展中对于高度抽象和复杂数据处理的需求。Scala函数式编程pdf是一个学习Scala函数式编程理论和实践的重要资源。 Scala函数式编程pdf包含Scala函数式编程核心概念和技术,例如高阶函数、不可变性、模匹配和递归等。它还涵盖了Scala函数式编程中的一些常见问题和解决方案,以及Scala函数式编程如何与面向对象编程 (OOP)相融合等。 Scala函数式编程pdf还提供了丰富的实际案例,包括使用Scala函数式编程技术实现算法、数据处理、Web应用程序、分布编程等等。 总之,Scala函数式编程pdf是Scala程序员学习和实践函数式编程的重要资源,它提供了理论、实践和案例相结合的综合性学习体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值