読者です 読者をやめる 読者になる 読者になる

Scalaのお勉強

書籍できちんとScalaを勉強することにした。

この本。
book.impress.co.jp


今日は二章まで読んだ。
第二章の練習問題の解答が以下(合っているかは知らぬ)

object Main2{
  private def fib(n:Int):Int={
    @annotation.tailrec
    def go(n:Int,a1:Int,a0:Int):Int=
      if (n==0) a1
      else go(n-1,a0,a1+a0)
    go(n,0,1)
  }

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

    loop(0)
  }
  private def curry[A,B,C](f:(A,B) => C):A => (B=>C)= (a:A)=>((b:B)=>f(a,b))
  private def uncurry[A,B,C](f:A=>B=>C):(A,B)=>C =(a:A,b:B)=>f(a)(b)
  private def compose[A,B,C](f:B=>C,g:A=>B):A=>C = (a:A)=>f(g(a))
  def main(args:Array[String]){
    println(fib(5))
    println(isSorted[Int](Array(1,2,3,4,5),(_ <= _)))
    println(isSorted[Int](Array(8,2,3,4,5),(_ <= _)))
    println(curry[Int,Int,Int]((_+_))(1)(2))
    println(compose[Int,Int,Int]((2*),(3+))(4))
  }
}


再帰が末尾呼び出しならばコンパイル時にループとして扱われ、再帰関数によってスタックをバカ食いされることはなくなることは始めて知った。