scala練習問題を解いてみた

Scala練習問題 - プログラミング言語 Scala Wiki - アットウィキ
問題


解答↓

object Exercises{
  def succ(n: Int) = n + 1
  def pred(n: Int) = n - 1
  
  //Exercise 1
  def add(x: Int, y: Int): Int = {
    if (y==0) x else add(succ(x), pred(y))
  }
  //Exercise 2
  def sum(x: List[Int]): Int = {
    if(x==Nil) 0 else add(x.head, sum(x.tail))
  }
  //Exercises 3
  def length[A](x: List[A]): Int= {
    if(x==Nil) 0 else succ(length(x.tail))
  }
  //Exercises 4
  def map[A, B](x: List[A], f:A=>B): List[B] = {
    if(x==Nil) Nil else f(x.head) :: map(x.tail, f)
  }
  //Exercises 5
  def filter[A](x: List[A], f: A => Boolean): List[A] = {
    if(x==Nil) Nil else {
      if(f(x.head)) x.head :: filter(x.tail, f) else filter(x.tail, f)
    }
  }
  //Exercises 6
  def append[A](x: List[A], y: List[A]): List[A] = {
    if(x==Nil) y else x.head :: append(x.tail, y)
  } 
  //Exercises 7
  def concat[A](x: List[List[A]]): List[A] = {
    if(x==Nil) Nil else append(x.head, concat(x.tail))
  }
  //Exercises 8
  def concatMap[A, B](x: List[A], f: A => List[B]): List[B] = {
    concat(map(x, f))
  }
  //Exercises 9
  def maximum(x: List[Int]): Int = {
    if(x.tail==Nil) x.head else {
      val a = maximum(x.tail)
      if(x.head>a) x.head else a
    }
  }
  //Exercises 10
  def reverse[A](x: List[A]): List[A] = {
    if(x==Nil) Nil else append(reverse(x.tail), List(x.head))
  }
}


Excercises9はそのまま書くと二重再帰になってしまいとんでもない時間かかるので変数使いましたが、特に変数使うなとは書いてないのでセフセフ。たぶん。