美文网首页
在Scala中使用函数式编程

在Scala中使用函数式编程

作者: 吐思圈 | 来源:发表于2018-02-18 00:08 被阅读0次

    把一个函数当作参数传递给另一个函数在纯函数式编程里很有用,它被称为高阶函数(high-order-function,缩写为HOF)
    想不通过修改一个循环变量而实现循环功能,可以借助递归函数。
    练习 2.1
    写一个递归函数,来获取第n个斐波那契数:
    分析:利用递归来完成循环求值,利用尾递归来优化循环

      def fib(n: Int): Int = {
        @tailrec
        def loop(prev: Int, cur: Int, n: Int): Int =
          if (n <= 0) prev
          else loop(cur, prev + cur, n - 1)
        loop(0, 1, n)
      }
    

    练习 2.2
    实现isSorted方法检测Array[A]是否按照给定的比较函数排序:
    分析:利用尾递归完成循环校验,利用泛型实现多态

      def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
        @tailrec
        def loop(n: Int, res: Boolean): Boolean =
          if(n <= 0) res
          else loop(n - 1, res && ordered(as(n), as(n - 1)))
        loop(as.length, true)
      }
    

    练习 2.3
    实现柯里化(currying),把带有两个参数的函数f转化为只有一个一个参数的部分应用函数f:

      def curry[A, B, C](f: (A, B) => C): A => (B => C) =
        a => {
          b => f(a, b)
        }
    

    练习2.4
    实现反柯里化(uncurry),与柯里化正相反

      def uncurry[A, B, C](f: A => B => C): (A, B) => C =
        (a, b) => f(a)(b)
    

    练习2.5
    实现一个高阶函数,可以组合两个函数为一个函数

      def compose[A, B, C](f: B => C, g: A => B): A => C =
        a => f(g(a)) 
    

    相关文章

      网友评论

          本文标题:在Scala中使用函数式编程

          本文链接:https://www.haomeiwen.com/subject/jzcptftx.html