FP in Scala勉強メモ(2)

高階関数、多相関数。

ここで言う多相は継承等による多相*1ではなく、型変数を利用した(総称)多相関数*2
この辺りは特に目新しいことは無かった。

データ型(List)

List[+A]として変位を共変にしてNil extends List[Nothing]とすることでval l: List[Int] = Nilみたいにできる。

演習問題

// Exercise 2.2
def isSorted[A](array: Array[A], p: (A, A) => Boolean): Boolean = {
  
  @annotation.tailrec
  def loop(n: Int): Boolean = {
    val next = n + 1
    if(array.length <= next){
      true
    }else if( p(array(n), array(next)) == false ){
      false
    }else{
      loop(n+1)
    }
  }
  
  loop(0)
}

// Exercise 2.3
def curry[A, B, C](f: (A, B) => C): A => (B => C) = a => b => f(a, b)

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

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