Search on the blog

2015年10月6日火曜日

[NewLang] Learn Scala(3)

 Scalaの勉強3回目です。
前回チュートリアルサイトを読破しましたので、今回から以下の本を読んでいくことにしました。



最初の方は比較的易しいのでChapter2まで読みました。
練習問題の回答を載せようと思いましたが、それだと芸がないので自分で問題を作って解いてみました。
  1. Int型の配列を受け取り配列内の要素の最大値を返す関数を定義せよ。関数のシグネチャはdef max(x : Array[Int]) : Intとする。
  2. 関数fと非負整数nを受け取り、関数f^n(関数fをn回適用する)を返す関数を定義せよ。関数のシグネチャはdef apply[A](f: A => A, n: Int) : A => Aとする。
以下サンプル回答です。
package chapter2

object Problem1 {
  
  def max(x : Array[Int]) : Int = {
    
    @annotation.tailrec
    def go(i: Int, acc: Int) : Int = {
      if (i == x.length) acc
      else if (acc > x(i)) go(i+1, acc)
      else go(i+1, x(i))
    }
    
    go(1, x(0))
  }
  
  def main(args: Array[String]) : Unit = {
    println(max(Array(2, 3, 1))) 
    println(max(Array(100)))
  }  
}
package chapter2

object Problem2 {
  
  def apply[A](f: A => A, n: Int) : A => A = {
    @annotation.tailrec
    def go(acc: A => A, m: Int) : A => A = {
      if (m == 0) x => acc(x)
      else go(x => f(acc(x)), m-1)
    }
    go(x => x, n)
  }
  
  def main(args: Array[String]) : Unit = {
    val f = apply[Int](_ + 2, 5)
    val g = apply[Int](_ * 2, 10)
        
    println(f(1))
    println(g(10))
    
  }  
}

0 件のコメント:

コメントを投稿