1. 程式人生 > >Scala之高階函式

Scala之高階函式

高階函式:把函式傳給函式

第一個高階函式:

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))