CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Functional Programming in
Bassam Abd El-Hamid@MrBassam
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Von Neumann architecture
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Von Neumann bottleneck
“Can Programming be Liberated from the von Neumann Style?”
John Backus 1977
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
History of FP languages
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
A formal system in mathematical logic and computer science for expressing computation by way of variable binding and substitution
λ-calculus
http://en.wikipedia.org/wiki/Lambda_calculus
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
* Referential transparency* No side effect * Remove unused expression safely
Pure functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Scalable LanguageMartin Odersky2003www.scala-lang.org
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Why Scala?
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Object-OrientedFunctionalStatically TypedRuns on the JVMCan Execute Java Code
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
All types are objectsType inference. Nested Functions.Functions are objects. Domain specific language (DSL) supportTraits.Closures. Concurrency support inspired by Erlang.
vs Java
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Who is using Scala?
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Who is using Scala?
And more ...
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Links:
Who's using Scala? (March, 2013)http://alvinalexander.com/scala/whos-using-scala-akka-play-framework
Scala Adoption by Enterpriseshttp://www.slideshare.net/mslinn/scala-adoption-by-enterprises
Scala in the Enterprisehttp://www.scala-lang.org/node/1658
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Syntax
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
// This is a valid comment /* This is a multiline comment */
Comments:
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object HelloWorld { def main(args: Array[String]) { println("Hello, world!") }}
Hello, world!
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
val s = "hello" // ; not requierdprintln(s) val s = "hello"; println(s) // ; is REQUIRED
Newline Characters
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Keywords
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
package com.bassam.stuff
// Import one classimport scala.collection.mutable.HashMap
// Import more than oneimport scala.collection.immutable.{TreeMap, TreeSet}
// Import allimport scala.xml._
Scala Packages
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
var or val VariableName : DataType [= Initial Value]
var myVar : String = "mutable variable"
val myVal : String = "immutable variable"
//Multiple assignments:val (myVar1: Int, myVar2: String) = Pair(5, "Foo")
Variable Declaration
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Data Types (the same data types as Java)
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc
def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); }}
Classes, Objects and Traits
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); }}class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zc
def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("Point x location : " + x); println ("Point y location : " + y); println ("Point z location : " + z); }}
Classes, Objects and Traits
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
trait someTrait { var somevar: Int=0 def someFun(x: Int): Int = (x*2)/5}
trait anotherTrait { var anothervar: Int=0 def anotherFun(x: Int): Int = (x*7)/100}
class class1(){}
class class2() extends class1 with someTrait with anotherTrait{}
Classes, Objects and Traits
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
private visible only inside the class or object
protected only accessible from subclasses
public accessed from anywhere (Default)
protected[UpToScope]private[UpToScpoe]
Access Modifiers
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
if(Boolean_expression 1){ //Executes when the Boolean expression 1 is true}else if(Boolean_expression 2){ //Executes when the Boolean expression 2 is true}else if(Boolean_expression 3){ //Executes when the Boolean expression 3 is true}else { //Executes when the none of the above condition is true.}
IF...ELSE
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
while(condition){ statement(s);}
do{ statement(s);}while( condition );
for( x <- Range ){ statement(s);}
Loop Types
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
import scala.util.control.Breaks...
var x:Int=1val brk=new Breaksbrk.breakable{while( x>0 ){ if (x==10) brk.break print(x) x=x+1 }}
break a loop
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def functionName ([list of parameters]) : [return type] = { function body return [expr]}
def sum(x:Int,z:Int):Int=z+xdef pi=3.14
Sum(5,6) //11
Functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def v:Int=5*6 def sum(x: => Int,z:Int):Int=z+x
sum(v,5) //35
Functions Call-by-Name
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def sum(x: Int,z: Int):Int=z+x
sum(z=5,x=6)
Functions with Named Arguments
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def sum( nums : Int* ) :Int ={ var buf:Int=0
for( i <- nums) buf=buf+i}
sum(5,2,74,....)
Function with Variable Arguments
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def sum( a:Int=5, b:Int=7 ) : Int = { var s:Int = 0 s = a + b return s}
Default Parameter Values for a Function
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def factorial(i: Int): Int = { def fact(i: Int, accumulator: Int): Int = { if (i <= 1) accumulator else fact(i - 1, i * accumulator) } fact(i, 1) }
Nested Functions - local functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def factorial(n: BigInt): BigInt = { if (n <= 1) 1 else n * factorial(n - 1) }
Recursion Functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def main(args: Array[String]) { val date = new Date log(date, "message1" ) log(date, "message2" ) log(date, "message3" ) }
def log(date: Date, message: String) = { println(date + "----" + message) }}
Partially Applied Functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def main(args: Array[String]) { val logWithDateBound = log(new Date, _ : String)
logWithDateBound("message1" ) logWithDateBound("message2" ) logWithDateBound("message3" ) }
def log(date: Date, message: String) = { println(date + "----" + message) }}
Partially Applied Functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
([list of parameters]) => function body
object Test { var sum=(x:Int,z:Int) => x+z
def main(args: Array[String]) { println(sum(5,6)) }}
Anonymous Functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def main(args: Array[String]) {
println( apply( layout, 10) )
}
def apply(f: Int => String, v: Int) = f(v)
def layout[A](x: A) = "[" + x.toString() + "]" }
Higher-Order Functions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
val multiplier = (i:Int) => i * 10
val multiplier = (i:Int) => i * factor
var factor = 3val multiplier = (i:Int) => i * factor
Closures
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Currying transforms a function that takes multiple parameters into a chain of functions, each taking a single parameter
Currying Functions schönfinkeling
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def strcat(s1: String,s2: String) = s1 + s2 def strcat(s1: String) = (s2: String) => s1 + s2
def main(args: Array[String]){print (strcat ("Hello ")("World"))
}
Currying Functions schönfinkeling
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
def sum(x: Int,z: Int) = x + z def main(args: Array[String]){ val sumCurried = Function.curried(sum _) print (sumCurried(5)(6)) }
Currying Functions schönfinkeling
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def main(args: Array[String]) { println(matchTest(3))
} def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" }}
Pattern Matching
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def main(args: Array[String]) { println(matchTest("two")) println(matchTest("test")) println(matchTest(1))
} def matchTest(x: Any): Any = x match { case 1 => "one" case "two" => 2 case y: Int => "scala.Int" case _ => "many" }}
Pattern Matching
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def main(args: Array[String]) { val alice = new Person("Alice", 25) val bob = new Person("Bob", 32) val charlie = new Person("Charlie", 32) for (person <- List(alice, bob, charlie)) { person match { case Person("Alice", 25) => println("Hi Alice!") case Person("Bob", 32) => println("Hi Bob!") case Person(name, age) => println("Age: " + age + " year, name: " + name + "?") }}} // case class, empty one. case class Person(name: String, age: Int)}
Pattern Matching
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
var x:Array[String] = new Array[String](3)
//or
var z = new Array[String](3)
Arrays
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
var x:Array[String] = new Array[String](3)//orvar x = new Array[String](3)//orvar x = Array("One", "Two", "Three")
x(0)="One" ; x(1)="Two" ; x(2)="Three"
Arrays
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
var myMatrix = Array.ofDim[Int](3,3)
myMatrix(0)(1)=10
Multi-Dimensional Arrays
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
var myArr1 = Array(1.9, 2.9, 3.4, 3.5)var myArr2 = Array(8.9, 7.9, 0.4, 1.5)
var myArr3 = Array.concat( myArr1, myArr2)
Arrays
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
var a=(0 to 10) //from 0 to 10var b=(0 until 10) //from 0 to 9var c=(0 to 10 by 2) // step 2
ranges
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
// List of Stringsval fruit: List[String] = List("apples", "oranges", "pears")
// List of Integersval nums: List[Int] = List(1, 2, 3, 4)
// Empty List.val empty: List[Nothing] = List()
// Two dimensional listval dim: List[List[Int]] = List( List(1, 0, 0), List(0, 1, 0), List(0, 0, 1) )
Lists
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
// List of Integersval nums = 1 :: (2 :: (3 :: (4 :: Nil)))
// Empty List.val empty = Nil
// Two dimensional listval dim = (1 :: (0 :: (0 :: Nil))) :: (0 :: (1 :: (0 :: Nil))) :: (0 :: (0 :: (1 :: Nil))) :: Nil
}}
Lists
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
// Empty set of integer typevar s : Set[Int] = Set()
// Set of integer typevar s : Set[Int] = Set(1,3,5,7)
//or
var s = Set(1,3,5,7)
Sets
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
/*Empty hash table whose keys are strings and values are integers:*/var A:Map[Char,Int] = Map()
// A map with keys and values.val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")
Maps / Hash tables
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
val tup = (1, "hello", Console)
//Which is syntactic sugar for:
val t = new Tuple3(1, "hello", Console)
val sum = t._1 + t._2 + t._3
t.productIterator.foreach{ i =>println("Value = " + i )}
Tuples
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def main(args: Array[String]) { val it = Iterator("a", "number", "of", "words") while (it.hasNext){ println(it.next()) } }}
Iterators
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
object Test { def findPerson(key: Int): Option[Person] def main(args: Array[String]) { val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo") println("capitals.get( \"France\" ) : " + capitals.get( "France" )) println("capitals.get( \"India\" ) : " + capitals.get( "India" )) }}
Options
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
import scala.util.matching.Regex
object Test { def main(args: Array[String]) { val pattern = "Scala".r val str = "Scala is Scalable and cool" println(pattern findFirstIn str) }}
Regular Expressions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
import java.io.FileReaderimport java.io.FileNotFoundExceptionimport java.io.IOException
object Test { def main(args: Array[String]) { try { val f = new FileReader("input.txt") } catch { case ex: FileNotFoundException =>>{ println("Missing file exception") } case ex: IOException => { println("IO Exception") }}}}
Exception Handling
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Questions
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala
Thank you :)