SlideShare uma empresa Scribd logo
1 de 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

Mais conteúdo relacionado

Mais procurados

High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance Haskell
Johan Tibell
 

Mais procurados (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
 

Semelhante a Functional programming with_scala

(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
 

Semelhante a Functional programming with_scala (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
 
Short Reference Card for R users.
Short Reference Card for R users.Short Reference Card for R users.
Short Reference Card for R users.
 
Reference card for R
Reference card for RReference card for R
Reference card for R
 
(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
 

Mais de Raymond Tay

Mais 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
 

Último

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 

Functional programming with_scala

  • 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