Lab nr 2


Ćwiczenia

  1. Zimplementuj brakującą funkcję insert.
    def isort(xs: List[Int]): List[Int] =
      if (xs.isEmpty) Nil
      else insert(xs.head, isort(xs.tail))
    
  2. Zaprojektuj length w wersji z rekursją ogonową.
  3. Rozważmy funkcję, która podnosi do kwadratu wszystkie elementy listy i w wyniku zwraca listę z tymi kwadratami. Uzupełnij poniższe równoważne definicje squareList.
    def squareList(xs: List[Int]): List[Int] = xs match {
      case List() => ??
      case y :: ys => ??
    }
    
    def squareList(xs: List[Int]): List[Int] =
      xs map ??
    
  4. Zdefiniuj forall i exists na podstawie filter.
  5. Uzupełnij brakujące wyrażenia tak żeby poniższe standardowe operacje na listach wyrazić za pomocą fold.
    def mapFun[A, B](xs: List[A], f: A => B): List[B] =
      (xs :\ List[B]()){ ?? }
    
    def lengthFun[A](xs: List[A]): int =
      (0 /: xs){ ?? }
    

Rozwiązania

  1. def isort(xs: List[Int]): List[Int] =
      if (xs.isEmpty) Nil
      else insert(xs.head, isort(xs.tail))
    
    def insert(x: Int, xs: List[Int]): List[Int] =
      if (xs.isEmpty) List(x)
      else if (x < xs.head) x::xs
      else xs.head :: insert(x, xs.tail)
    
  2. def len(l: List[Any]):Int = {
      def len_pom(n: Int, lpom: List[Any]):Int = {
        if (lpom.isEmpty) n
        else len_pom(n+1, lpom.tail)
      }
      len_pom(0,l)
    }
    
  3. def squareList(xs: List[Int]): List[Int] = xs match {
      case List() => xs
      case y :: ys => y*y :: squareList(ys)
    }
    
    def squareList2(xs: List[Int]): List[Int] =
      xs map (x=>x*x)
    
  4. def forall[T](list: List[T], condition: T => Boolean) =
       (list filter (x => !condition(x))) == Nil
    
     def exists[T](list: List[T], condition: T => Boolean) =
       (list filter (x => condition(x))) != Nil
    
  5. def mapFun[A, B](xs: List[A], f: A => B): List[B] =
      (xs :\ List[B]()){ (item,list) => f(item)::list }
    
    def lengthFun[A](xs: List[A]): int =
      (0 /: xs){ ((len,item) => len+1) }