Scala 関数型デザイン&プログラミング 2章 Exercise

社内でFP in Scala勉強会が始まったので、再読がてら解いてみました。

2.1

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

  go(n, 0, 1)
}

2.2

def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
  @annotation.tailrec
  def go(n: Int): Boolean = 
    if (n >= as.length) true
    else if (! ordered(as(n - 1), as(n))) false
    else go(n - 1)
  
  go(1)
}

2.3

def curry[A, B, C](f: (A, B) => C): A => (B => C) = (a: A) => f(a, _)

2.4

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

2.5

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