62
CAIRO TECH CLUB SESSION 5: Functional Programming in Scala Functional Programming in Bassam Abd El-Hamid @MrBassam

Functional Programming in Scala

Embed Size (px)

DESCRIPTION

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Citation preview

Page 1: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Functional Programming in

Bassam Abd El-Hamid@MrBassam

Page 2: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Von Neumann architecture

Page 3: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Von Neumann bottleneck

“Can Programming be Liberated from the von Neumann Style?”

John Backus 1977

Page 4: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

History of FP languages

Page 5: Functional Programming in Scala

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

Page 6: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

* Referential transparency* No side effect * Remove unused expression safely

Pure functions

Page 7: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Scalable LanguageMartin Odersky2003www.scala-lang.org

Page 8: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Why Scala?

Page 9: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Object-OrientedFunctionalStatically TypedRuns on the JVMCan Execute Java Code

Page 10: Functional Programming in Scala

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

Page 11: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Who is using Scala?

Page 12: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Who is using Scala?

And more ...

Page 13: Functional Programming in Scala

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

Page 14: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Syntax

Page 15: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

// This is a valid comment /* This is a multiline comment */

Comments:

Page 16: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

object HelloWorld { def main(args: Array[String]) { println("Hello, world!") }}

Hello, world!

Page 17: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

val s = "hello" // ; not requierdprintln(s) val s = "hello"; println(s) // ; is REQUIRED

Newline Characters

Page 18: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Keywords

Page 19: Functional Programming in Scala

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

Page 20: Functional Programming in Scala

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

Page 21: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Data Types (the same data types as Java)

Page 22: Functional Programming in Scala

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

Page 23: Functional Programming in Scala

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

Page 24: Functional Programming in Scala

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

Page 25: Functional Programming in Scala

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

Page 26: Functional Programming in Scala

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

Page 27: Functional Programming in Scala

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

Page 28: Functional Programming in Scala

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

Page 29: Functional Programming in Scala

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

Page 30: Functional Programming in Scala

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

Page 31: Functional Programming in Scala

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

Page 32: Functional Programming in Scala

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

Page 33: Functional Programming in Scala

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

Page 34: Functional Programming in Scala

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

Page 35: Functional Programming in Scala

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

Page 36: Functional Programming in Scala

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

Page 37: Functional Programming in Scala

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

Page 38: Functional Programming in Scala

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

Page 39: Functional Programming in Scala

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

Page 40: Functional Programming in Scala

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

Page 41: Functional Programming in Scala

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

Page 42: Functional Programming in Scala

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

Page 43: Functional Programming in Scala

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

Page 44: Functional Programming in Scala

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

Page 45: Functional Programming in Scala

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

Page 46: Functional Programming in Scala

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

Page 47: Functional Programming in Scala

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

Page 48: Functional Programming in Scala

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

Page 49: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

var myMatrix = Array.ofDim[Int](3,3)

myMatrix(0)(1)=10

Multi-Dimensional Arrays

Page 50: Functional Programming in Scala

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

Page 51: Functional Programming in Scala

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

Page 52: Functional Programming in Scala

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

Page 53: Functional Programming in Scala

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

Page 54: Functional Programming in Scala

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

Page 55: Functional Programming in Scala

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

Page 56: Functional Programming in Scala

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

Page 57: Functional Programming in Scala

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

Page 58: Functional Programming in Scala

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

Page 59: Functional Programming in Scala

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

Page 60: Functional Programming in Scala

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

Page 61: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Questions

Page 62: Functional Programming in Scala

CAIRO TECH CLUB SESSION 5: Functional Programming in Scala

Thank you :)