Advertisement
asbestovek

Ensemble

Feb 18th, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.51 KB | None | 0 0
  1. import scala.annotation.tailrec
  2.  
  3. sealed trait Ensemble[+A]
  4.  
  5. case object Eli extends Ensemble[Nothing]
  6. case class Cons[+A](head: A, tail: Ensemble[A]) extends Ensemble[A]
  7.  
  8. object Ensemble {
  9.   def add[A](a: A, list: Ensemble[A]): Ensemble[A] = Cons(a, list)
  10.   def printEnsemble[A](a: Ensemble[A]): Unit = a match {
  11.     case Eli => print("Nil\n")
  12.     case Cons(head, tail) => { print(head + " "); printEnsemble(tail) }
  13.   }
  14.  
  15.   def fallLeft[A](en: Ensemble[A])(f: (A, A) => A): A = {
  16.     val Cons(a, b) = en
  17.     @tailrec
  18.     def go(en: Ensemble[A], a: A): A = en match {
  19.       case Eli => a
  20.       case Cons(head, tail) => go(tail, f(head, a))
  21.     }  
  22.     go(b, a)
  23.   }
  24.  
  25.   def foldLeft[A,B](en: Ensemble[A], b: B)(f: (A, B) => B): B = en match {
  26.     case Eli => b
  27.     case Cons(head, tail) => foldLeft(tail, f(head, b))(f)
  28.   }
  29.  
  30.   def map[A,B](en: Ensemble[A])(f: (A) => B): Ensemble[B] = en match {
  31.     case Eli => Eli
  32.     case Cons(head, tail) => Cons(f(head), map(tail)(f))
  33.   }
  34.  
  35.   def filter[A](en: Ensemble[A])(p: (A) => Boolean): Ensemble[A] = en match {
  36.     case Eli => en
  37.     case Cons(head, tail) if p(head) => Cons(head, filter(tail)(p))
  38.     case Cons(_, tail) => filter(tail)(p)
  39.   }
  40.  
  41.   def length[A](en: Ensemble[A]): Int = foldLeft(en, 0)((a, b) => b + 1)
  42.  
  43. }
  44.  
  45. val simpleIntList = Cons(0, Cons(1, Cons(2, Cons(3, Eli))))
  46. val plusOneList = Ensemble.map(simpleIntList)(_ + 1)
  47. Ensemble.printEnsemble(Ensemble.filter(plusOneList)(_ >= 2))
  48. val l: Int = Ensemble.length(plusOneList)
  49. println(l)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement