Day 2: Scala and Math

So today I went on with Martin Odersky’s course and just completed week 5. The functional equivalent of operator overloading is awesome and I believe it allows more verbose and consistent definition of classes which will behave as expected if I plug in normal operators. The definition of functions is now more and more tending towards how we define them in maths : f: [R, R] => R.

I also read about the object oriented implementation of functions and I believe have understood functional programming paradigm to a great degree. Scala’s elegant combination of both fp and oop allows us to implement programs in a better way. Scala’s pattern matching is also good enough to allow us to implement recursive algorithms in a better way.

I have also compiled a program highlighting the collections in scala:

object collection {
def main(args: Array[String]):Unit = {
// Different types of sequences
// Base class Seq whose base class is Iterable
// List
val l: List[Int] = List(1, 2, 3, 4)
/** Head access faster
* Useful for recursive algorithms
* accessing any element takes time
* maps and filters need to be applied step by step
* Apending an element x to list xs = x :: xs || xs :: x
* Appending two lists xs and ys = xs ++ ys || ys ++ xs
* Immutable
**/
// Vector
val v: Vector[Int] = Vector(1, 2, 3, 4)
/** Any random element access faster
* maps and filters applied in chunks of 32 which is faster
* Appending an element x to vector xs = x +: xs || xs :+ x
* */
//Arrays and strings
val a: Array[Int] = Array(1, 2, 3, 4)
val s = "Hello World"
/** Not exactly a subclass of Seq but supports functions
* Normal linear access
**/
// Range
val r: Range = 1 to 10 by 2
/** does not support that many Seq functions because its simpler
* */
// Sequences functions
// drop n
// drops first n elements
a drop 2 // Array(3, 4)
// take n
// takes first n elements
a take 2 // Array(1, 2)
// dropWhile and takeWhile
// takes or drops from beginning as long as a condition is being satisfied
a takeWhile (_ < 3) // Array(1, 2)
// span
// Applies dropWhile and takeWhile simultaneously
a span (_ < 3) // a pair (Array[Int], Array[Int]) = (Array(1, 2), Array(3, 4))
// Map
a map (x => x * x) // Square all elements of a
v map (_ * 2) // Double all elements of v and so on
// Filter
s filter (_.isUpper) // Return only uppercase
a filter (_ < 3) // Return an array of all less than 3
// Fold left
// function passed is of the form f: (T,T) => T
(l foldLeft 0) (_ + _) // Sum of all elements
(l foldLeft 1) (_ * _) // Product of all elements
// exists(p) p is of the form T => Boolean
a exists (_ > 4) // False
s exists (_.isUpper) // True
// forall p
a forall (_ < 5) // True
s forall (_.isLower) // False
// zip
l zip s // Output is List[(Int, Char)] = List((1, 'H'),...,(4, 'l'))
// unzip is reverse of that, returns pair of lists
// sum
a.sum // 10
// max
a.max // 4
// prime check
def isPrime(n: Int) = (2 until Math.sqrt(n).asInstanceOf[Int]) forall (n % _ != 0)
}
}