高阶函数:把函数传给函数
第一个高阶函数:
def formatResult(name:String,n:Int,f:Int=>Int)={
val msg="The %s of %d is %d."
msg.format(name,n,f(n))
}
formatResult是一个高阶函数,他接受一个函数f为参数,参数的类型是Int=>Int,表示接受整型并返回一个整型结果。
多态函数
通常,在写高阶函数时,希望写出的代码能够适用于任何类型,它们被称为“多态函数”,有时也叫“泛型函数”。
def partiall[A,B,C](a:A,f:(A,B)=>C):B=>C
函数partiall有三个类型参数:A,B,C。它带有两个参数,参数f是一个有两个类型分别为A,B的参数、返回值类型为C的函数。函数
partiall的返回值也是一个函数,类型为B=>C。
我们来尝试练习下:
一、实现isSorted方法,检测Array[A]是否按照给定的比较函数排序。
def isSorted[A](as:Array[A],ordered(A,A)=>Boolean):Boolean
二、实现一个高阶函数,可以组合两个函数为一个函数
def compose[A,B,C](f:B=>C,g:A=>B):A=>C
ANSWERS:
一、
def isSorted[A](as: Array[A], ordered: (A,A) => Boolean): Boolean = {
@annotation.tailrec
def go(n: Int): Boolean =
if (n >= as.length-1) true
else if (ordered(as(n), as(n+1))) false
else go(n+1)
go(0)
}
二、
def compose[A,B,C](f: B => C, g: A => B): A => C =
a => f(g(a))