SlideShare une entreprise Scribd logo
1  sur  28
-Functionalλ
Programming
with Scala
©2013 Raymond Tay
About m(e)
I write code.
I write books too !
https://github.com/raygit/Introduction_to_Scala
The Whats and Whos
Is Scala a fad?
This is when i first heard of Scala
Mutability
val x = 3
var y = 3
Mutability?scala> val x = mutable.HashMap[String,String]()
x: scala.collection.mutable.HashMap[String,String] = Map()
scala> x += ("a" "a")→
res0: x.type = Map(a -> a)
------
scala> val y = immutable.HashMap[String,String]()
y: scala.collection.immutable.HashMap[String,String] = Map()
scala> y += ("a" "a")→
<console>:9: error: reassignment to val
y += ("a" "a")→
Free of side effects
• Code reuse
• Make better building blocks
• Easier to reason about, optimize and test
Functions are First-classdef multiplyFour : Int Int = (4 * )⇒
def addTwo: Int Int = (2 + )⇒
def º[A,B,C](f:A B, g : B C ) = f andThen g // Parametric-⇒ ⇒
polymorphism
def f = º(multiplyFour , addTwo) // We’ll make it look more ‘natural’
in the section: Typeclasses
f(4)
res6: Int = 18
(addTwo compose multiplyFour)(4)
res4: Int = 18
Closure
val x = 3 // what if its `var x = 3`?
def = (y: Int) x + yλ ⇒
Be careful what you `close` over i.e. context-
sensitive
val xval x λλ33
var xvar x λλ33
77
Lambdas
def g( : Int Int) =λ ⇒ λ
g((x:Int) x * 2)⇒ OK
g( (x:Int) (y:Int) x + y )⇒ ⇒ FAIL
g( ((x: Int) (y: Int) x + y)(4) )⇒ ⇒ OK
Matching
// simulate a binary tree
sealed trait Tree
case class Branch(ele: Int, left:Tree: right:Tree) extends Tree
case object Leaf extends Tree
// inOrder aka Depth-First Traversal
def inOrder(t:Tree) : List[Int] = t match {
case Branch(ele, l, r) inOrder(l):::List(ele):::inOrder(r)⇒
case Leaf Nil⇒
}
Recursion
def string2spaces(ss: List[Char]) = ss match {
case Nil Nil⇒
case h :: tail ‘ ‘ :: string2spaces(tail)⇒
}
import scala.annotation.tailrec
@tailrec
def string2spaces(ss: List[Char], acc: List[Char]): List[Char] = ss match {
case Nil acc⇒
case h :: tail string2spaces(tail,‘ ‘ +: acc)⇒
}
Lazy vs Eager Eval
def IamEager[A](value:A)
def IamLazy[A](value: ⇒ A)
TypeclassesWhat I really want to write is
(addTwo ∘ multiplyFour)(4) and not
(addTwo compose multiplyFour)(4)
typeclasses - create higher kinded types! e.g.
List[Int Int]⇒
Typeclasses in Scala
trait Fn extends (Int Int) {⇒
def apply(x: Int) : Int
def º(f: Fn) = f andThen this
}
def addTwo = new Fn { def apply(x: Int) = 2 + x }
def multiplyFour = new Fn { def apply(x: Int) = 4 * x }
multiplyFour º addTwo
res0: Int => Int = <function1>
(addTwo º multiplyFour)(4)
res1: Int = 18
Typeclasses in Scala
sealed trait MList[+A]
case object Nil extends MList[Nothing]
case class ::[+A](head:A, tail: MList[A]) extends
MList[A]
object MList {
def apply[A](xs:A*) : MList[A] = if (xs.isEmpty) Nil
else ::(xs.head, apply(xs.tail: _*))
}
Typeclasses in Scala
object Main extends App {
val x = MList(1,2,3,4,5) match {
case ::(x, ::(2, ::(4, _))) => x
case Nil => 42
case ::(x, ::(y, ::(3, ::(4, _)))) => x + y
case ::(h, t) => h
case _ => 101
}
println(s"value of ${x}")
}
Adhoc Polymorphism
scala> (1,2,3) map { 1 + _ }
<console>:8: error: value map is not a member of (Int,
Int, Int)
(1,2,3) map { 1 + _ }
scala> implicit def giveMeMap[A](t : Tuple3[A,A,A]) =
new Tuple3[A,A,A](t._1, t._2, t._3) {
def map[B](f: A => B) = new Tuple3(f(_1), f(_2), f(_3))
}
scala> (1,2,3) map { 1 + _ }res1: (Int, Int, Int) = (2,3,4)
Adhoc Concurrency
class Matrix(val repr:Array[Array[Double]])
trait ThreadStrategy {
def execute[A](f: () A) : () A⇒ ⇒
}
object SingleThreadStrategy extends ThreadStrategy { //
uses a single thread }
object ThreadPoolStrategy extends ThreadStrategy { //
uses a thread pool }
Adhoc Concurrency
scala> val m = new Matrix(Array(Array(1.2, 2.2),Array(3.4, 4.5)))
m: Matrix =
Matrix
|1.2 | 2.2|
|3.4 | 4.5|
scala> val n = new Matrix(Array(Array(1.2, 2.2),Array(3.4, 4.5)))
n: Matrix =
Matrix
|1.2 | 2.2|
|3.4 | 4.5|
Adhoc Concurrency
scala> MatrixUtils.multiply(m, n)
res1: Matrix =
Matrix
|8.92 | 12.540000000000001|
|19.38 | 27.73|
scala> MatrixUtils.multiply(m, n)(ThreadPoolStrategy)
Executing function on thread: 38
Executing function on thread: 39
Executing function on thread: 40
Executing function on thread: 41
Concurrency on
Collections!
par
val parList = (1 to 1000000).toList.par
(1 to 1000000).toList.par.partition{ _ % 2 == 0 }
Functional Data
Structures - List
def foldRight[A,B](l: List[A], z: B)(f: (A,B) B) : B = l match {⇒
case Nil z⇒
case ::(h, t) f(h, foldRight(t,z)(f))⇒
}
@tailrec
def foldLeft[A,B](l: List[A], z: B)(f: (B,A) B) : B = l match {⇒
case Nil z⇒
case ::(h, t) => foldLeft(t, f(z,h))(f)
}
Reactive Concurrency
If i had more time...
• Existential Types
• Self Types
• Structural Typing (think Duck Typing)
• Compile-time metaprogramming
(macros,quasiquotes)
• Reactive Programming through Akka
• Monoids, Monads, Endos, Corecursive and a
whole lot more
Thanks
twitter: @RaymondTayBL

Contenu connexe

Tendances

Scala parallel-collections
Scala parallel-collectionsScala parallel-collections
Scala parallel-collectionsKnoldus Inc.
 
Rewriting Java In Scala
Rewriting Java In ScalaRewriting Java In Scala
Rewriting Java In ScalaSkills Matter
 
Functions In Scala
Functions In Scala Functions In Scala
Functions In Scala Knoldus Inc.
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in SwiftSaugat Gautam
 
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...Philip Schwarz
 
Sequence and Traverse - Part 1
Sequence and Traverse - Part 1Sequence and Traverse - Part 1
Sequence and Traverse - Part 1Philip Schwarz
 
Addendum to ‘Monads do not Compose’
Addendum to ‘Monads do not Compose’ Addendum to ‘Monads do not Compose’
Addendum to ‘Monads do not Compose’ Philip Schwarz
 
High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance HaskellJohan Tibell
 
Scala collection methods flatMap and flatten are more powerful than monadic f...
Scala collection methods flatMap and flatten are more powerful than monadic f...Scala collection methods flatMap and flatten are more powerful than monadic f...
Scala collection methods flatMap and flatten are more powerful than monadic f...Philip Schwarz
 
Haskell for data science
Haskell for data scienceHaskell for data science
Haskell for data scienceJohn Cant
 

Tendances (16)

Scala parallel-collections
Scala parallel-collectionsScala parallel-collections
Scala parallel-collections
 
Rewriting Java In Scala
Rewriting Java In ScalaRewriting Java In Scala
Rewriting Java In Scala
 
Scala Parallel Collections
Scala Parallel CollectionsScala Parallel Collections
Scala Parallel Collections
 
Functions In Scala
Functions In Scala Functions In Scala
Functions In Scala
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
 
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
 
Sequence and Traverse - Part 1
Sequence and Traverse - Part 1Sequence and Traverse - Part 1
Sequence and Traverse - Part 1
 
Python list
Python listPython list
Python list
 
Addendum to ‘Monads do not Compose’
Addendum to ‘Monads do not Compose’ Addendum to ‘Monads do not Compose’
Addendum to ‘Monads do not Compose’
 
High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance Haskell
 
Lec4
Lec4Lec4
Lec4
 
Python data handling notes
Python data handling notesPython data handling notes
Python data handling notes
 
20170509 rand db_lesugent
20170509 rand db_lesugent20170509 rand db_lesugent
20170509 rand db_lesugent
 
Python programming : List and tuples
Python programming : List and tuplesPython programming : List and tuples
Python programming : List and tuples
 
Scala collection methods flatMap and flatten are more powerful than monadic f...
Scala collection methods flatMap and flatten are more powerful than monadic f...Scala collection methods flatMap and flatten are more powerful than monadic f...
Scala collection methods flatMap and flatten are more powerful than monadic f...
 
Haskell for data science
Haskell for data scienceHaskell for data science
Haskell for data science
 

Similaire à Functional Programming with Scala in 40 Characters

(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?Tomasz Wrobel
 
Power of functions in a typed world
Power of functions in a typed worldPower of functions in a typed world
Power of functions in a typed worldDebasish Ghosh
 
R command cheatsheet.pdf
R command cheatsheet.pdfR command cheatsheet.pdf
R command cheatsheet.pdfNgcnh947953
 
Fp in scala part 2
Fp in scala part 2Fp in scala part 2
Fp in scala part 2Hang Zhao
 
Introduction to parallel and distributed computation with spark
Introduction to parallel and distributed computation with sparkIntroduction to parallel and distributed computation with spark
Introduction to parallel and distributed computation with sparkAngelo Leto
 
Short Reference Card for R users.
Short Reference Card for R users.Short Reference Card for R users.
Short Reference Card for R users.Dr. Volkan OBAN
 
Advance LISP (Artificial Intelligence)
Advance LISP (Artificial Intelligence) Advance LISP (Artificial Intelligence)
Advance LISP (Artificial Intelligence) wahab khan
 
FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳Yuri Inoue
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesTomer Gabel
 

Similaire à Functional Programming with Scala in 40 Characters (20)

Scala Collections
Scala CollectionsScala Collections
Scala Collections
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
 
Introducing scala
Introducing scalaIntroducing scala
Introducing scala
 
Zippers
ZippersZippers
Zippers
 
Scala Bootcamp 1
Scala Bootcamp 1Scala Bootcamp 1
Scala Bootcamp 1
 
Power of functions in a typed world
Power of functions in a typed worldPower of functions in a typed world
Power of functions in a typed world
 
Scala Paradigms
Scala ParadigmsScala Paradigms
Scala Paradigms
 
R command cheatsheet.pdf
R command cheatsheet.pdfR command cheatsheet.pdf
R command cheatsheet.pdf
 
@ R reference
@ R reference@ R reference
@ R reference
 
Fp in scala part 2
Fp in scala part 2Fp in scala part 2
Fp in scala part 2
 
Introduction to parallel and distributed computation with spark
Introduction to parallel and distributed computation with sparkIntroduction to parallel and distributed computation with spark
Introduction to parallel and distributed computation with spark
 
Reference card for R
Reference card for RReference card for R
Reference card for R
 
Short Reference Card for R users.
Short Reference Card for R users.Short Reference Card for R users.
Short Reference Card for R users.
 
(Ai lisp)
(Ai lisp)(Ai lisp)
(Ai lisp)
 
Advance LISP (Artificial Intelligence)
Advance LISP (Artificial Intelligence) Advance LISP (Artificial Intelligence)
Advance LISP (Artificial Intelligence)
 
tidyr.pdf
tidyr.pdftidyr.pdf
tidyr.pdf
 
FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳
 
R gráfico
R gráficoR gráfico
R gráfico
 
Scala by Luc Duponcheel
Scala by Luc DuponcheelScala by Luc Duponcheel
Scala by Luc Duponcheel
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type Classes
 

Plus de Raymond Tay

Principled io in_scala_2019_distribution
Principled io in_scala_2019_distributionPrincipled io in_scala_2019_distribution
Principled io in_scala_2019_distributionRaymond Tay
 
Building a modern data platform with scala, akka, apache beam
Building a modern data platform with scala, akka, apache beamBuilding a modern data platform with scala, akka, apache beam
Building a modern data platform with scala, akka, apache beamRaymond Tay
 
Toying with spark
Toying with sparkToying with spark
Toying with sparkRaymond Tay
 
Distributed computing for new bloods
Distributed computing for new bloodsDistributed computing for new bloods
Distributed computing for new bloodsRaymond Tay
 
Introduction to cuda geek camp singapore 2011
Introduction to cuda   geek camp singapore 2011Introduction to cuda   geek camp singapore 2011
Introduction to cuda geek camp singapore 2011Raymond Tay
 
Introduction to Erlang
Introduction to ErlangIntroduction to Erlang
Introduction to ErlangRaymond Tay
 
Introduction to CUDA
Introduction to CUDAIntroduction to CUDA
Introduction to CUDARaymond Tay
 

Plus de Raymond Tay (8)

Principled io in_scala_2019_distribution
Principled io in_scala_2019_distributionPrincipled io in_scala_2019_distribution
Principled io in_scala_2019_distribution
 
Building a modern data platform with scala, akka, apache beam
Building a modern data platform with scala, akka, apache beamBuilding a modern data platform with scala, akka, apache beam
Building a modern data platform with scala, akka, apache beam
 
Practical cats
Practical catsPractical cats
Practical cats
 
Toying with spark
Toying with sparkToying with spark
Toying with spark
 
Distributed computing for new bloods
Distributed computing for new bloodsDistributed computing for new bloods
Distributed computing for new bloods
 
Introduction to cuda geek camp singapore 2011
Introduction to cuda   geek camp singapore 2011Introduction to cuda   geek camp singapore 2011
Introduction to cuda geek camp singapore 2011
 
Introduction to Erlang
Introduction to ErlangIntroduction to Erlang
Introduction to Erlang
 
Introduction to CUDA
Introduction to CUDAIntroduction to CUDA
Introduction to CUDA
 

Dernier

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 

Dernier (20)

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 

Functional Programming with Scala in 40 Characters

  • 2. About m(e) I write code. I write books too !
  • 3.
  • 6. Is Scala a fad? This is when i first heard of Scala
  • 7. Mutability val x = 3 var y = 3
  • 8. Mutability?scala> val x = mutable.HashMap[String,String]() x: scala.collection.mutable.HashMap[String,String] = Map() scala> x += ("a" "a")→ res0: x.type = Map(a -> a) ------ scala> val y = immutable.HashMap[String,String]() y: scala.collection.immutable.HashMap[String,String] = Map() scala> y += ("a" "a")→ <console>:9: error: reassignment to val y += ("a" "a")→
  • 9. Free of side effects • Code reuse • Make better building blocks • Easier to reason about, optimize and test
  • 10. Functions are First-classdef multiplyFour : Int Int = (4 * )⇒ def addTwo: Int Int = (2 + )⇒ def º[A,B,C](f:A B, g : B C ) = f andThen g // Parametric-⇒ ⇒ polymorphism def f = º(multiplyFour , addTwo) // We’ll make it look more ‘natural’ in the section: Typeclasses f(4) res6: Int = 18 (addTwo compose multiplyFour)(4) res4: Int = 18
  • 11. Closure val x = 3 // what if its `var x = 3`? def = (y: Int) x + yλ ⇒ Be careful what you `close` over i.e. context- sensitive val xval x λλ33 var xvar x λλ33 77
  • 12. Lambdas def g( : Int Int) =λ ⇒ λ g((x:Int) x * 2)⇒ OK g( (x:Int) (y:Int) x + y )⇒ ⇒ FAIL g( ((x: Int) (y: Int) x + y)(4) )⇒ ⇒ OK
  • 13. Matching // simulate a binary tree sealed trait Tree case class Branch(ele: Int, left:Tree: right:Tree) extends Tree case object Leaf extends Tree // inOrder aka Depth-First Traversal def inOrder(t:Tree) : List[Int] = t match { case Branch(ele, l, r) inOrder(l):::List(ele):::inOrder(r)⇒ case Leaf Nil⇒ }
  • 14. Recursion def string2spaces(ss: List[Char]) = ss match { case Nil Nil⇒ case h :: tail ‘ ‘ :: string2spaces(tail)⇒ } import scala.annotation.tailrec @tailrec def string2spaces(ss: List[Char], acc: List[Char]): List[Char] = ss match { case Nil acc⇒ case h :: tail string2spaces(tail,‘ ‘ +: acc)⇒ }
  • 15. Lazy vs Eager Eval def IamEager[A](value:A) def IamLazy[A](value: ⇒ A)
  • 16. TypeclassesWhat I really want to write is (addTwo ∘ multiplyFour)(4) and not (addTwo compose multiplyFour)(4) typeclasses - create higher kinded types! e.g. List[Int Int]⇒
  • 17. Typeclasses in Scala trait Fn extends (Int Int) {⇒ def apply(x: Int) : Int def º(f: Fn) = f andThen this } def addTwo = new Fn { def apply(x: Int) = 2 + x } def multiplyFour = new Fn { def apply(x: Int) = 4 * x } multiplyFour º addTwo res0: Int => Int = <function1> (addTwo º multiplyFour)(4) res1: Int = 18
  • 18. Typeclasses in Scala sealed trait MList[+A] case object Nil extends MList[Nothing] case class ::[+A](head:A, tail: MList[A]) extends MList[A] object MList { def apply[A](xs:A*) : MList[A] = if (xs.isEmpty) Nil else ::(xs.head, apply(xs.tail: _*)) }
  • 19. Typeclasses in Scala object Main extends App { val x = MList(1,2,3,4,5) match { case ::(x, ::(2, ::(4, _))) => x case Nil => 42 case ::(x, ::(y, ::(3, ::(4, _)))) => x + y case ::(h, t) => h case _ => 101 } println(s"value of ${x}") }
  • 20. Adhoc Polymorphism scala> (1,2,3) map { 1 + _ } <console>:8: error: value map is not a member of (Int, Int, Int) (1,2,3) map { 1 + _ } scala> implicit def giveMeMap[A](t : Tuple3[A,A,A]) = new Tuple3[A,A,A](t._1, t._2, t._3) { def map[B](f: A => B) = new Tuple3(f(_1), f(_2), f(_3)) } scala> (1,2,3) map { 1 + _ }res1: (Int, Int, Int) = (2,3,4)
  • 21. Adhoc Concurrency class Matrix(val repr:Array[Array[Double]]) trait ThreadStrategy { def execute[A](f: () A) : () A⇒ ⇒ } object SingleThreadStrategy extends ThreadStrategy { // uses a single thread } object ThreadPoolStrategy extends ThreadStrategy { // uses a thread pool }
  • 22. Adhoc Concurrency scala> val m = new Matrix(Array(Array(1.2, 2.2),Array(3.4, 4.5))) m: Matrix = Matrix |1.2 | 2.2| |3.4 | 4.5| scala> val n = new Matrix(Array(Array(1.2, 2.2),Array(3.4, 4.5))) n: Matrix = Matrix |1.2 | 2.2| |3.4 | 4.5|
  • 23. Adhoc Concurrency scala> MatrixUtils.multiply(m, n) res1: Matrix = Matrix |8.92 | 12.540000000000001| |19.38 | 27.73| scala> MatrixUtils.multiply(m, n)(ThreadPoolStrategy) Executing function on thread: 38 Executing function on thread: 39 Executing function on thread: 40 Executing function on thread: 41
  • 24. Concurrency on Collections! par val parList = (1 to 1000000).toList.par (1 to 1000000).toList.par.partition{ _ % 2 == 0 }
  • 25. Functional Data Structures - List def foldRight[A,B](l: List[A], z: B)(f: (A,B) B) : B = l match {⇒ case Nil z⇒ case ::(h, t) f(h, foldRight(t,z)(f))⇒ } @tailrec def foldLeft[A,B](l: List[A], z: B)(f: (B,A) B) : B = l match {⇒ case Nil z⇒ case ::(h, t) => foldLeft(t, f(z,h))(f) }
  • 27. If i had more time... • Existential Types • Self Types • Structural Typing (think Duck Typing) • Compile-time metaprogramming (macros,quasiquotes) • Reactive Programming through Akka • Monoids, Monads, Endos, Corecursive and a whole lot more