在Scala中使用函数式编程
2018-02-18 本文已影响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))