SlideShare a Scribd company logo
Functional
Programming
Past, Present and Future
Pushkar N Kulkarni
IBM Runtimes
IBM India Software Lab
Functional Programming - today’s special
…
• Timeline – parallel to the imperative timeline
• Languages
• Concepts
Goal: Bootstrapping for functional programming
The beginning of all creation …
Theory of Computation <- Math + Logic
Alonzo Church
Lambda Calculus
Alan Turing
Turing Machine
Stephen Kleene
Recursive Function
Theory
Lambda Calculus
It’s a formal system in mathematical logic for
expressing computation based on function
abstraction and application using variable binding
and substitution.
~ Wikipedia
Lambda Calculus – Fundamental Idea
x //variable
t //lambda term
Λx.t //lambda abstraction
Λx. x2
+1 // x is bound in t by Λx
Λx. x2
+1(2) = 22
+1 = 5 //application
Note: A lambda abstraction has no name
LISP - 1958
LIST Processor
Influenced by Church’s
lambda calculus
notation
Multi-paradigm, pre-fix
notation
John McCarthy
LISP
;;Employee compensation
(defun total (bonus-calc base)
(+ (funcall bonus-calc base) base))
;; Good month
(total #'(lambda (x)(* 0.8 x)) 10000)
;; Bad month
(total #'(lambda (x)(+ (* 0.2 x) 10)) 10000)
LISP – Well known dialects
• Scheme – 1970
• Common Lisp – 1984
• Racket – 1984
• Clojure – 2007
• Lisp Flavoured Erlang (LFE) – 2008 (v1 March
2016)
Functional Programming Past Present Future
Academic Research (1960 – 1985)
• ISWIM – If You See What I Mean – 1966
• SASL – St. Andrews Static Language – 1972
• ML – MetaLanguage – 1973 => Ocaml, F#
• Miranda – 1985 => Haskell
Back to some Lambda Calculus
F(x) = x3
+4x //F(x) id a first-order function
//maps values to values
dF(x)/dx = 3x2
+ 4
//d/dx maps functions to functions
d/dx is an example of higher-order functions
Higher-order Functions
A function is a higher-order function if:
• It takes at least one function as an argument OR
• It returns a function
All other functions are first–order functions!
Erlang - 1984
Designed for massive scalable soft real time
systems
Fault-tolerance and concurrency
Erlang
Multi-paradigm, but has a functional core
•First-class functions
Functions can be passed to functions
First-class citizens
=> Higher-order functions
•Immutable values
Immutable “variables” – creating new values instead
Minimizing moving parts has benefits
Erlang – Higher-order functions
%base salaries
S = [10000, 30000, 40000, 15000].
%The Bonus calculator
Bonus = fun(X)-> X + X*0.2 + 1500 end.
%Total salaries
T = lists:map(Bonus, S)
>> [13500, 37500, 49500, 19500]
Erlang – Higher-order functions
%find total salaries exceeding 30000
MoreThan30K = fun(Y) -> Y > 30000 end.
lists:filter(MoreThan30K,T).
>> [37500, 49500]
You just learnt “map” and “filter”. Let them sink in!
Haskell - 1990
• Full blown functional language
• Algebraic data types and type classes
• No statements – the entire program is an
”expression”
• Pattern matching
• Lazy evaluation
• Purely functional – functions have no side effect
Haskell – Algebraic Data Types (ADT)
• Derived from Type Theory
• A composite type - formed by combining other
types
data List a = Nil
| Cons a (List a)
data Tree a = Node a (Tree a) (Tree a)
| Nil
Haskell – Pattern Matching
-- construct a List from an list
makeList (x:xs) = Cons x (makeList xs)
makeList [] = Nil
-- construct an list from a List
makeArr (Cons x (xs)) = x:(makeArr xs)
makeArr Nil = []
Quiz
Why was the language named Haskell?
Haskell Curry (1900 – 1982)
Currying
Introduced by Shönfinkel
Lambda calculus deals with single argument
functions
What about multiple argument functions then?
If F(X, Y, Z) -> N, then
curry(F): X -> (Y -> (Z -> N))
Lambda Calculus - Currying
F(X, Y, Z) = X + Y + Z
F(1, 2, 3) = Fcurried(1)(2)(3)
//apply only one argument at a time
Fcurried (1) = F’curried
F’curried(2) = F”curried
F”curried(3) = 6
OCaml - 1996
• Multi-paradigm
• Derived from ML
• Static type system helps eliminate runtime
problems
• Emphasis on performance – good optimizing
compiler
Currying in OCaml
# let plus x y z = x + y + z;;
# plus 1 2 3;;
- : int = 6
# let x = plus 1;;
val x : int -> int -> int = <fun>
Currying in OCaml
# let y = x 2;;
val y : int -> int = <fun>
# y 3;;
- : int = 6
Cool, but what’s the use of all this?
Currying in OCaml
Function to add 2 to all numbers of a list
let add2 x = x + 2
List.map add2 [1;2;3;4;5];;
Function to add 3 to all numbers of a list
let add3 x = x + 3
List.map add3 [1;2;3;4;5];;
Currying in OCaml
With currying:
let add x y = x + y
List.map (add 2) [1;2;3;4;5]
List.map (add 3) [1;2;3;4;5]
•Better reuse of code
•Improved readability
Quiz
What significant event occurred around 1995
in the Programming Languages space?
Functional Programming on the JVM
(2004 – date)
• Groovy - 2003
• Scala - 2004
• Clojure - 2007
• Java 8 - 2014
Scala
• Seamless integration with
Java
• Combines object oriented
programming and functional
programming
• Type inference
• Higher order functions
• Pattern matchingMartin Odersky
Scala
Simple functional code to find the length of a list:
(no loops in functional programming!)
def listLength (list: List[_]): Int =
list match {
case Nil => 0
case _ => 1 + listLength(list.tail)
}
Any problems here?
Scala
listLength(List.Range(0, 100000))
>> StackOverflow
Are loops better than recursive calls then?
Has functional programming hit a barrier here?
Scala - TCO
No! You have tail recursion and tail-recursion
optimization (TCO)
def length(as: List[_]): Int = {
@tailrec
def length0(as: List[_], count: Int = 0): Int =
as match {
case Nil => count
case head :: tail => length0(tail, count+ 1)
}
length0(as)
}
Scala - TCO
Simplistic essence of tail-call optimization
Execution state
Single, reusable
stack frame
Clojure - 2007
Our fascination with LISP is never ending!
Rich Hickey
• LISP for the JVM
• Java-Clojure
interoperability
• Other implementations –
ClojureScript,
ClojureCLR
• Used in creative
computing!
Clojure
(defn fib[n]
(condp = n
0 1
1 1
(+ (fib (- n 1)) (fib (- n 2)))))
user=> (time (fib 40))
"Elapsed time: 2946.136757 msecs"
165580141
user=> (time (fib 40))
"Elapsed time: 2882.10746 msecs"
165580141
Clojure
Pure functions
•Referential Transparency
•No side effects – stateless programs
•Given an argument, the function must return the
same value! (fib 4) is always 3, for example.
=> Values (fib K) can be reused for all K
Speed up? Caching?
Clojure - Memoization
(def m-fib
(memoize (fn [n]
(condp = n
0 1
1 1
(+ (m-fib (- n 1)) (m-fib (- n 2)))))))
Clojure - Memoization
user=> (time (m-fib 40))
"Elapsed time: 0.823773 msecs"
165580141
user=> (time (m-fib 40))
"Elapsed time: 0.082013 msecs"
165580141
Java 8 - 2014
The exciting times begin!
•Lambdas
•Stream Interface – lazy evaluation!
•Functional Interfaces
•Default methods – for backward compatibility
A mammoth like Java embracing the functional
paradigm is a big cue about the times to come.
Lazy Evaluation
Laziness is not always bad
Lazy Evaluation
• Evaluate an expression only when it’s use is
encountered
• Values are created only when needed
• Reduction in memory footprint
• Fast
• In combination with memoization, results in very
efficient functional code
Problem
Find the number of first deliveries of overs, when a
batsman who scored at least five centuries and hit at
least 100 sixes, was out.
Java 8 – Lazy Evaluation
allDeliveries.stream()
.filter(d -> d.deliveryNumber() == 1)
.filter(d -> d.wicket())
.map(d -> d.getBatsman())
.filter(b -> b.totalCenturies() >= 5)
.filter(b -> b.totalSixes >= 100)
.count() //terminal operation
•Lambdas
•Immutability
•Lazy evaluation, terminal operation
•Map/filter
Java 8 - Parallelism
Parallel execution. Almost zero change to your code.
allDeliveries.parallelStream()
.filter(d -> d.deliveryNumber() == 1)
.filter(d -> d.wicket())
.map(d -> d.getBatsman())
.filter(b -> b.totalCenturies() >= 5)
.filter(b -> b.totalSixes >= 100)
.count() //terminal operation
Java 8
• No intentions of becoming a full blown functional
language
• Lambdas and lazy evaluation provide a big boost
• Readability improved – anonymous classes not
needed
• Reusability improved – lambdas, functional
interfaces
• Java 9 – better Stream interface expected
Idris – A peek into the future
• Data types are first class objects!
• You can generate data types, store them, pass
them around
• Dependent types were developed by Haskell
Curry to deepen the connection between
programming and logic (Curry-Howard
correspondence)
• Dependent types – types that depend on values!
• Influenced by Agda
Idris – dependent types
ListType : (singleton : Bool) -> Type
ListType False = List Nat
ListType True = Nat
sumList : (singleton : Bool)->ListType singleton->Nat
sumList False (x :: xs) = x + sumList False xs
sumList False [] = 0
sumList True x = x
Why Functional Programming
• Higher levels of behavioural abstraction – tell what
is to be done, not how to do it
• Agile Methodologies - Code reuse, readability
• Correctness
• Exploiting massively parallel hardware
Challenges
• Paradigm shift in thinking needed
• Newer design patterns – no imperative design
patterns
• Performance evaluation difficult – recursive data
structures, recursive functions
• Runtime performance – garbage collection critical
Recap
• Lambda Calculus
• Lambdas
• First-class functions, higher order functions
• Algebraic data types
• Pattern matching
• Currying
Recap
• Tail-call recursion and TCO
• Pure functions, referential transparency
• Memoization
• Lazy evaluation
• Parallelism
• Dependent data types
A programming language that does not change the way you
think is not worth knowing ~ Alan Perlis
Functional programming changes the way you think.
It’s worth knowing!
(Thank you!)
(twitter @pushkar_nk)
(github pushkarnk)

More Related Content

PDF
Harnessing the Power of Java 8 Streams
PDF
How to Think in RxJava Before Reacting
PDF
Parallel streams in java 8
PDF
Java 8 Stream API. A different way to process collections.
PDF
Reactive Programming for a demanding world: building event-driven and respons...
PPTX
Столпы функционального программирования для адептов ООП, Николай Мозговой
PPTX
Introduction to rx java for android
PDF
If You Think You Can Stay Away from Functional Programming, You Are Wrong
Harnessing the Power of Java 8 Streams
How to Think in RxJava Before Reacting
Parallel streams in java 8
Java 8 Stream API. A different way to process collections.
Reactive Programming for a demanding world: building event-driven and respons...
Столпы функционального программирования для адептов ООП, Николай Мозговой
Introduction to rx java for android
If You Think You Can Stay Away from Functional Programming, You Are Wrong

What's hot (20)

PDF
Spark workshop
PDF
The... Wonderful? World of Lambdas
PPTX
Hot Streaming Java
PPTX
An Introduction to RxJava
PDF
How and why I turned my old Java projects into a first-class serverless compo...
PDF
Java programming lab manual
PDF
Spark schema for free with David Szakallas
PPTX
Apache Flink Training: DataSet API Basics
PDF
Java 8 Workshop
PPTX
Functional Reactive Programming (FRP): Working with RxJS
PDF
Java Lab Manual
PDF
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
PPTX
Java Language fundamental
PDF
Practical RxJava for Android
PDF
Laziness, trampolines, monoids and other functional amenities: this is not yo...
PPTX
Apache Flink Training: DataStream API Part 2 Advanced
PDF
Reactive programming on Android
PDF
Sneaking inside Kotlin features
PDF
RxJava 2.0 介紹
PDF
Functional Programming in Java 8 - Lambdas and Streams
Spark workshop
The... Wonderful? World of Lambdas
Hot Streaming Java
An Introduction to RxJava
How and why I turned my old Java projects into a first-class serverless compo...
Java programming lab manual
Spark schema for free with David Szakallas
Apache Flink Training: DataSet API Basics
Java 8 Workshop
Functional Reactive Programming (FRP): Working with RxJS
Java Lab Manual
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Java Language fundamental
Practical RxJava for Android
Laziness, trampolines, monoids and other functional amenities: this is not yo...
Apache Flink Training: DataStream API Part 2 Advanced
Reactive programming on Android
Sneaking inside Kotlin features
RxJava 2.0 介紹
Functional Programming in Java 8 - Lambdas and Streams
Ad

Viewers also liked (20)

PPTX
Agile offshoring to India
PDF
Building & scaling a live streaming mobile platform - Gr8 road to fame
PDF
Changing application demands: What developers need to know
PPT
Building Resilient Microservices
PDF
Refactor your Java EE application using Microservices and Containers - Arun G...
PPTX
Blockchain technology a primer
PDF
Merging micrservices architecture with SOA Practices
PPTX
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
ODP
Understanding Bitcoin (Blockchain) and its Potential for Disruptive Applications
PDF
Simplify Cloud Applications using Spring Cloud
ODP
Microservices Past, Present, Future
PDF
John Davies of C24 - BlockChain - Blockbuster or Bullshit?
PDF
Spring IO 2016 - Spring Cloud Microservices, a journey inside a financial entity
ODP
Spring cloud for microservices architecture
PPTX
Cryptocurrencies, Blockchain & Smart Contracts: A General Introduction
PDF
Microservices with Spring Boot
PDF
Microservices with Java, Spring Boot and Spring Cloud
PDF
Microservice With Spring Boot and Spring Cloud
PDF
Microservices + Events + Docker = A Perfect Trio by Docker Captain Chris Rich...
PDF
Docker for Ops: Extending Docker with APIs, Drivers and Plugins by Arnaud Por...
Agile offshoring to India
Building & scaling a live streaming mobile platform - Gr8 road to fame
Changing application demands: What developers need to know
Building Resilient Microservices
Refactor your Java EE application using Microservices and Containers - Arun G...
Blockchain technology a primer
Merging micrservices architecture with SOA Practices
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Understanding Bitcoin (Blockchain) and its Potential for Disruptive Applications
Simplify Cloud Applications using Spring Cloud
Microservices Past, Present, Future
John Davies of C24 - BlockChain - Blockbuster or Bullshit?
Spring IO 2016 - Spring Cloud Microservices, a journey inside a financial entity
Spring cloud for microservices architecture
Cryptocurrencies, Blockchain & Smart Contracts: A General Introduction
Microservices with Spring Boot
Microservices with Java, Spring Boot and Spring Cloud
Microservice With Spring Boot and Spring Cloud
Microservices + Events + Docker = A Perfect Trio by Docker Captain Chris Rich...
Docker for Ops: Extending Docker with APIs, Drivers and Plugins by Arnaud Por...
Ad

Similar to Functional Programming Past Present Future (20)

PDF
Functional Programming #FTW
PPS
Presentation of GetTogether on Functional Programming
PPTX
The joy of functional programming
PPTX
Good functional programming is good programming
PPTX
Functional programming
PDF
Functional programming in Scala
PDF
Functional Programming 之二三事
PDF
Introduction to functional programming (In Arabic)
PDF
Why you should care about functional programming
PPTX
Scala, Play 2.0 & Cloud Foundry
PDF
The Next Great Functional Programming Language
PDF
Rainer Grimm, “Functional Programming in C++11”
PDF
Functional programming
PDF
Intro to Functional Programming
PDF
Clojure intro
PPTX
Introduction to Functional Programming
PPTX
About Functional Programming
KEY
Scala: functional programming for the imperative mind
PDF
Is there a perfect data-parallel programming language? (Experiments with More...
PDF
Functional Programming Principles & Patterns
Functional Programming #FTW
Presentation of GetTogether on Functional Programming
The joy of functional programming
Good functional programming is good programming
Functional programming
Functional programming in Scala
Functional Programming 之二三事
Introduction to functional programming (In Arabic)
Why you should care about functional programming
Scala, Play 2.0 & Cloud Foundry
The Next Great Functional Programming Language
Rainer Grimm, “Functional Programming in C++11”
Functional programming
Intro to Functional Programming
Clojure intro
Introduction to Functional Programming
About Functional Programming
Scala: functional programming for the imperative mind
Is there a perfect data-parallel programming language? (Experiments with More...
Functional Programming Principles & Patterns

More from IndicThreads (20)

PPTX
Http2 is here! And why the web needs it
PPT
Go Programming Language - Learning The Go Lang way
PPT
App using golang indicthreads
PDF
Building on quicksand microservices indicthreads
PPT
Iot secure connected devices indicthreads
PDF
Real world IoT for enterprises
PPT
IoT testing and quality assurance indicthreads
PPTX
Internet of things architecture perspective - IndicThreads Conference
PDF
Cars and Computers: Building a Java Carputer
PPTX
Scrap Your MapReduce - Apache Spark
PPT
Continuous Integration (CI) and Continuous Delivery (CD) using Jenkins & Docker
PPTX
Speed up your build pipeline for faster feedback
PPT
Unraveling OpenStack Clouds
PPTX
Digital Transformation of the Enterprise. What IT leaders need to know!
PDF
Architectural Considerations For Complex Mobile And Web Applications
PPTX
Functional Programming With Lambdas and Streams in JDK8
PPTX
Data Privacy using IoTs in Smart Cities Project
PDF
Big Data Analytics using Amazon Elastic MapReduce and Amazon Redshift
PPT
Indic threads pune12-grammar of graphicsa new approach to visualization-karan
PDF
Indic threads pune12-java ee 7 platformsimplification html5
Http2 is here! And why the web needs it
Go Programming Language - Learning The Go Lang way
App using golang indicthreads
Building on quicksand microservices indicthreads
Iot secure connected devices indicthreads
Real world IoT for enterprises
IoT testing and quality assurance indicthreads
Internet of things architecture perspective - IndicThreads Conference
Cars and Computers: Building a Java Carputer
Scrap Your MapReduce - Apache Spark
Continuous Integration (CI) and Continuous Delivery (CD) using Jenkins & Docker
Speed up your build pipeline for faster feedback
Unraveling OpenStack Clouds
Digital Transformation of the Enterprise. What IT leaders need to know!
Architectural Considerations For Complex Mobile And Web Applications
Functional Programming With Lambdas and Streams in JDK8
Data Privacy using IoTs in Smart Cities Project
Big Data Analytics using Amazon Elastic MapReduce and Amazon Redshift
Indic threads pune12-grammar of graphicsa new approach to visualization-karan
Indic threads pune12-java ee 7 platformsimplification html5

Recently uploaded (20)

PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Essential Infomation Tech presentation.pptx
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
AI in Product Development-omnex systems
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PPTX
Odoo POS Development Services by CandidRoot Solutions
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
medical staffing services at VALiNTRY
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
L1 - Introduction to python Backend.pptx
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PPTX
history of c programming in notes for students .pptx
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PTS Company Brochure 2025 (1).pdf.......
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Wondershare Filmora 15 Crack With Activation Key [2025
Which alternative to Crystal Reports is best for small or large businesses.pdf
Essential Infomation Tech presentation.pptx
Upgrade and Innovation Strategies for SAP ERP Customers
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
AI in Product Development-omnex systems
How to Migrate SBCGlobal Email to Yahoo Easily
Odoo POS Development Services by CandidRoot Solutions
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
VVF-Customer-Presentation2025-Ver1.9.pptx
medical staffing services at VALiNTRY
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
L1 - Introduction to python Backend.pptx
Operating system designcfffgfgggggggvggggggggg
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
history of c programming in notes for students .pptx
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Adobe Illustrator 28.6 Crack My Vision of Vector Design

Functional Programming Past Present Future

  • 1. Functional Programming Past, Present and Future Pushkar N Kulkarni IBM Runtimes IBM India Software Lab
  • 2. Functional Programming - today’s special … • Timeline – parallel to the imperative timeline • Languages • Concepts Goal: Bootstrapping for functional programming
  • 3. The beginning of all creation …
  • 4. Theory of Computation <- Math + Logic Alonzo Church Lambda Calculus Alan Turing Turing Machine Stephen Kleene Recursive Function Theory
  • 5. Lambda Calculus It’s a formal system in mathematical logic for expressing computation based on function abstraction and application using variable binding and substitution. ~ Wikipedia
  • 6. Lambda Calculus – Fundamental Idea x //variable t //lambda term Λx.t //lambda abstraction Λx. x2 +1 // x is bound in t by Λx Λx. x2 +1(2) = 22 +1 = 5 //application Note: A lambda abstraction has no name
  • 7. LISP - 1958 LIST Processor Influenced by Church’s lambda calculus notation Multi-paradigm, pre-fix notation John McCarthy
  • 8. LISP ;;Employee compensation (defun total (bonus-calc base) (+ (funcall bonus-calc base) base)) ;; Good month (total #'(lambda (x)(* 0.8 x)) 10000) ;; Bad month (total #'(lambda (x)(+ (* 0.2 x) 10)) 10000)
  • 9. LISP – Well known dialects • Scheme – 1970 • Common Lisp – 1984 • Racket – 1984 • Clojure – 2007 • Lisp Flavoured Erlang (LFE) – 2008 (v1 March 2016)
  • 11. Academic Research (1960 – 1985) • ISWIM – If You See What I Mean – 1966 • SASL – St. Andrews Static Language – 1972 • ML – MetaLanguage – 1973 => Ocaml, F# • Miranda – 1985 => Haskell
  • 12. Back to some Lambda Calculus F(x) = x3 +4x //F(x) id a first-order function //maps values to values dF(x)/dx = 3x2 + 4 //d/dx maps functions to functions d/dx is an example of higher-order functions
  • 13. Higher-order Functions A function is a higher-order function if: • It takes at least one function as an argument OR • It returns a function All other functions are first–order functions!
  • 14. Erlang - 1984 Designed for massive scalable soft real time systems Fault-tolerance and concurrency
  • 15. Erlang Multi-paradigm, but has a functional core •First-class functions Functions can be passed to functions First-class citizens => Higher-order functions •Immutable values Immutable “variables” – creating new values instead Minimizing moving parts has benefits
  • 16. Erlang – Higher-order functions %base salaries S = [10000, 30000, 40000, 15000]. %The Bonus calculator Bonus = fun(X)-> X + X*0.2 + 1500 end. %Total salaries T = lists:map(Bonus, S) >> [13500, 37500, 49500, 19500]
  • 17. Erlang – Higher-order functions %find total salaries exceeding 30000 MoreThan30K = fun(Y) -> Y > 30000 end. lists:filter(MoreThan30K,T). >> [37500, 49500] You just learnt “map” and “filter”. Let them sink in!
  • 18. Haskell - 1990 • Full blown functional language • Algebraic data types and type classes • No statements – the entire program is an ”expression” • Pattern matching • Lazy evaluation • Purely functional – functions have no side effect
  • 19. Haskell – Algebraic Data Types (ADT) • Derived from Type Theory • A composite type - formed by combining other types data List a = Nil | Cons a (List a) data Tree a = Node a (Tree a) (Tree a) | Nil
  • 20. Haskell – Pattern Matching -- construct a List from an list makeList (x:xs) = Cons x (makeList xs) makeList [] = Nil -- construct an list from a List makeArr (Cons x (xs)) = x:(makeArr xs) makeArr Nil = []
  • 21. Quiz Why was the language named Haskell?
  • 22. Haskell Curry (1900 – 1982)
  • 23. Currying Introduced by Shönfinkel Lambda calculus deals with single argument functions What about multiple argument functions then? If F(X, Y, Z) -> N, then curry(F): X -> (Y -> (Z -> N))
  • 24. Lambda Calculus - Currying F(X, Y, Z) = X + Y + Z F(1, 2, 3) = Fcurried(1)(2)(3) //apply only one argument at a time Fcurried (1) = F’curried F’curried(2) = F”curried F”curried(3) = 6
  • 25. OCaml - 1996 • Multi-paradigm • Derived from ML • Static type system helps eliminate runtime problems • Emphasis on performance – good optimizing compiler
  • 26. Currying in OCaml # let plus x y z = x + y + z;; # plus 1 2 3;; - : int = 6 # let x = plus 1;; val x : int -> int -> int = <fun>
  • 27. Currying in OCaml # let y = x 2;; val y : int -> int = <fun> # y 3;; - : int = 6 Cool, but what’s the use of all this?
  • 28. Currying in OCaml Function to add 2 to all numbers of a list let add2 x = x + 2 List.map add2 [1;2;3;4;5];; Function to add 3 to all numbers of a list let add3 x = x + 3 List.map add3 [1;2;3;4;5];;
  • 29. Currying in OCaml With currying: let add x y = x + y List.map (add 2) [1;2;3;4;5] List.map (add 3) [1;2;3;4;5] •Better reuse of code •Improved readability
  • 30. Quiz What significant event occurred around 1995 in the Programming Languages space?
  • 31. Functional Programming on the JVM (2004 – date) • Groovy - 2003 • Scala - 2004 • Clojure - 2007 • Java 8 - 2014
  • 32. Scala • Seamless integration with Java • Combines object oriented programming and functional programming • Type inference • Higher order functions • Pattern matchingMartin Odersky
  • 33. Scala Simple functional code to find the length of a list: (no loops in functional programming!) def listLength (list: List[_]): Int = list match { case Nil => 0 case _ => 1 + listLength(list.tail) } Any problems here?
  • 34. Scala listLength(List.Range(0, 100000)) >> StackOverflow Are loops better than recursive calls then? Has functional programming hit a barrier here?
  • 35. Scala - TCO No! You have tail recursion and tail-recursion optimization (TCO) def length(as: List[_]): Int = { @tailrec def length0(as: List[_], count: Int = 0): Int = as match { case Nil => count case head :: tail => length0(tail, count+ 1) } length0(as) }
  • 36. Scala - TCO Simplistic essence of tail-call optimization Execution state Single, reusable stack frame
  • 37. Clojure - 2007 Our fascination with LISP is never ending! Rich Hickey • LISP for the JVM • Java-Clojure interoperability • Other implementations – ClojureScript, ClojureCLR • Used in creative computing!
  • 38. Clojure (defn fib[n] (condp = n 0 1 1 1 (+ (fib (- n 1)) (fib (- n 2))))) user=> (time (fib 40)) "Elapsed time: 2946.136757 msecs" 165580141 user=> (time (fib 40)) "Elapsed time: 2882.10746 msecs" 165580141
  • 39. Clojure Pure functions •Referential Transparency •No side effects – stateless programs •Given an argument, the function must return the same value! (fib 4) is always 3, for example. => Values (fib K) can be reused for all K Speed up? Caching?
  • 40. Clojure - Memoization (def m-fib (memoize (fn [n] (condp = n 0 1 1 1 (+ (m-fib (- n 1)) (m-fib (- n 2)))))))
  • 41. Clojure - Memoization user=> (time (m-fib 40)) "Elapsed time: 0.823773 msecs" 165580141 user=> (time (m-fib 40)) "Elapsed time: 0.082013 msecs" 165580141
  • 42. Java 8 - 2014 The exciting times begin! •Lambdas •Stream Interface – lazy evaluation! •Functional Interfaces •Default methods – for backward compatibility A mammoth like Java embracing the functional paradigm is a big cue about the times to come.
  • 43. Lazy Evaluation Laziness is not always bad
  • 44. Lazy Evaluation • Evaluate an expression only when it’s use is encountered • Values are created only when needed • Reduction in memory footprint • Fast • In combination with memoization, results in very efficient functional code
  • 45. Problem Find the number of first deliveries of overs, when a batsman who scored at least five centuries and hit at least 100 sixes, was out.
  • 46. Java 8 – Lazy Evaluation allDeliveries.stream() .filter(d -> d.deliveryNumber() == 1) .filter(d -> d.wicket()) .map(d -> d.getBatsman()) .filter(b -> b.totalCenturies() >= 5) .filter(b -> b.totalSixes >= 100) .count() //terminal operation •Lambdas •Immutability •Lazy evaluation, terminal operation •Map/filter
  • 47. Java 8 - Parallelism Parallel execution. Almost zero change to your code. allDeliveries.parallelStream() .filter(d -> d.deliveryNumber() == 1) .filter(d -> d.wicket()) .map(d -> d.getBatsman()) .filter(b -> b.totalCenturies() >= 5) .filter(b -> b.totalSixes >= 100) .count() //terminal operation
  • 48. Java 8 • No intentions of becoming a full blown functional language • Lambdas and lazy evaluation provide a big boost • Readability improved – anonymous classes not needed • Reusability improved – lambdas, functional interfaces • Java 9 – better Stream interface expected
  • 49. Idris – A peek into the future • Data types are first class objects! • You can generate data types, store them, pass them around • Dependent types were developed by Haskell Curry to deepen the connection between programming and logic (Curry-Howard correspondence) • Dependent types – types that depend on values! • Influenced by Agda
  • 50. Idris – dependent types ListType : (singleton : Bool) -> Type ListType False = List Nat ListType True = Nat sumList : (singleton : Bool)->ListType singleton->Nat sumList False (x :: xs) = x + sumList False xs sumList False [] = 0 sumList True x = x
  • 51. Why Functional Programming • Higher levels of behavioural abstraction – tell what is to be done, not how to do it • Agile Methodologies - Code reuse, readability • Correctness • Exploiting massively parallel hardware
  • 52. Challenges • Paradigm shift in thinking needed • Newer design patterns – no imperative design patterns • Performance evaluation difficult – recursive data structures, recursive functions • Runtime performance – garbage collection critical
  • 53. Recap • Lambda Calculus • Lambdas • First-class functions, higher order functions • Algebraic data types • Pattern matching • Currying
  • 54. Recap • Tail-call recursion and TCO • Pure functions, referential transparency • Memoization • Lazy evaluation • Parallelism • Dependent data types
  • 55. A programming language that does not change the way you think is not worth knowing ~ Alan Perlis Functional programming changes the way you think. It’s worth knowing!