funkcji jako rezultat wywołania funkcji 3. Przypisanie funkcji do zmiennej def f1(g: Int => Int): Int = g(2) f1(x => 3 * x) def f2(x: Int): Int => Int = { y: Int => y + x } f2(5)(4) val f3 = f2(10) f3(20)
match { case Nil => 0 case x :: xs if pred(x) => 1 + countBy(xs, pred) case _ :: xs => countBy(xs, pred) } def sumBy[A](list: List[A], f: A => Double): Double = list match { case Nil => 0.0 case x :: xs => f(x) + sumBy(xs, f) }
0.0): Double = list match { case Nil => acc case x :: xs => sumBy(xs, f, f(x) + acc) } def countBy[A](list: List[A], pred: A => Bool, acc: Int = 0): Int = list match { case Nil => acc case x :: xs if pred(x) => countBy(xs, pred, 1 + acc) case _ :: xs => countBy(xs, pred, acc) }
3. Większość struktur danych posiada efektywne niemutowalne odpowiedniki 4. Niemutowalne struktury mają swoje osobliwości, np: a. efektywny dostęp do początku listy b. złączanie list w czasie liniowym - wymaga przebudowania pierwszej z nich
Abstrakcje numeryczne 3. Mapowanie schematu bazy danych 4. Generowanie losowych wartości 5. Abstrakcje w teorii kategorii (Functor, Monad, Applicative, etc.) 6. Walidacje strukturalne* 7. Transformacje danych*
i utrzymywanie ogromnych ilości kodu 2. Jednolita implementacja wszystkich instancji 3. Wiele bibliotek już teraz oferuje gotowe reguły do generycznej derywacji (wystarczy jeden import i voilà!) 4. Type safety
=> A) extends Console[A] case class PrintLine[A](line: String, rest: Console[A]) extends Console[A] case class ReadLine[A](rest: String => Console[A]) extends Console[A] PrintLine("Hello, what is your name?", ReadLine(name => PrintLine(s"Good to meet you, $name") ) )