SlideShare a Scribd company logo
1 of 26
Download to read offline
Globalcode	–	Open4education
Trilha – Programação Funcional
Roberto Pepato Mellado
Engenheiro de Software
Globalcode	–	Open4education
Haskell 101
“Haskell is a computer programming language. In particular, it is
a p o l y m o r p h i c a l l y s t a t i c a l l y t y p e d , l a z y, p u r e l y
functional language, quite different from most other programming
languages.”
https://wiki.haskell.org/Introduction
Function Application Immutability Currying
Category Theory Monads
Function Composition
…
Globalcode	–	Open4education
Understandability

Formalism
Data? Code?
int x = 2;
private int incr (int seed)
{
return seed + 1;
}
Code + Data
Prelude> x = 2
Prelude> incr x = x + 1
Code is Data
Functions as first class citizens
Static Typing
Prelude> x = 2
-- :type or :t 

Prelude> :t x

x :: Num t => t
Prelude> incr x = x + 1
Prelude> :t incr

incr :: Num a => a -> a
Basic Types
Type
A collection of related values
Bool
Logical values: True, False.
Char
Single Characters
String
Strings of characters
Int
Fixed-point precision integers
Integer
Arbitrary precision integers
Float
Single-precision floating points
List
Sequence of elements of the same
type
Tuple
A finite sequence of components of
possibly different types
e.g. (Bool -> Bool)
All Bool to Bool function mappings
Function Application
In mathematics…
f (a, b) + c d
Prelude> adder a = a + 1
Prelude> tripler c = c * 3
Prelude> adder 2
3
Prelude> adder (tripler 4)
13
f a b + c * d
((f a) b) + c * d
Currying
Prelude> sum a b = a + b
Prelude> :t sum

sum :: Num a => a -> a -> a
Prelude> square x = x * x
Prelude> :t square

square :: Num a => a -> a
In haskell, functions are curried
Currying
Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Prelude> map (+ 1) [1,2,3,4,5]
[2,3,4,5,6]
Prelude> squares = map square
:t squares
squares :: Num b => [b] -> [b]
squares [1,2,3,4,5]
[1,4,9,16,25]
High Order Functions
Prelude> twice f x = f (f x)
Prelude> twice (*2) 3

12
Prelude> twice reverse [1,2,3]
[1,2,3]
Sum of the squares of all even numbers from 1 to 100?
sum: adds items from a list

square: already defined

filter: filter list elements

even: true if a number is even, false otherwise
Prelude> sumsqreven ns = sum(map (square)
(filter even ns))
Prelude> sumsqreven [1..100]
171700
Function Composition
Prelude> double x = x + x
Prelude> triple x = double x + x
Prelude> sixTimes = double . triple
Prelude> sixTimes 5
30
Function Composition
Prelude> fsum = sum . map (square) . filter even
Prelude> [1..100]
[1,2,3,4,5,6,7,…]
Prelude> fsum [1..100]
171700
Prelude> verifyStatus = …
Prelude> checkCredit = …
Prelude> validate = …
Prelude> generateOrder = …
Prelude> sendEmail = …
Prelude> applyTransaction = sendEmail . generateOrder
. validate . checkCredit . verifyStatus
Pattern Matching
Prelude> head [1..10]
1
Prelude> tail [1..10]
[2,3,4,5,6,7,8,9,10]
Prelude> length [] = 0
Prelude> length (_:xs) = 1 + length xs
Prelude> length []
0
Prelude> length [2,2,2,2,2,2,2]
7
Prelude> cabeca (x:xs) = x
1
Prelude> cauda(x:xs) = xs
[2,3,4,5,6,7,8,9,10]
Prelude> cabeca (x:_) = x
Prelude> cauda(_:xs) = xs
Pattern Matching
Prelude> check (403, ip, timestamp) = ip
Prelude> check (_, _, _) = “ok”
Prelude> analyzelog xs = [check x | x <- xs]
Prelude> analyzelog [

(200, “200.251.192.13”, 1467313969905), 

(403, “200.168.175.28”, 1467314005735), 

(500, “201.52.164.78, 1467314029977)
]
“ok”
“200.168.175.28”
“ok”
Lazy
Prelude> mult (x, y) = x * y
Call by value
> mult (1+2, 3+4)
{ applying + }
mult (3, 3 + 4)
{ applying + }
mult (3, 7)
{ applying mult }
3 * 7
{ applying * }
21
Call by name
> mult (1+2, 3+4)
{ applying mult }
(1+2) * (3+4)
{ applying + }
3 * (3 + 4)
{ applying + }
3 * 7
{ applying * }
21
Haskell strategy is based
on call-by-name
Lazy
Prelude> list = 1 : 2 : []
[1,2]
Call by value
> head ones
{ applying ones }
head (1 : ones)

{ applying ones }
head (1 : (1 : ones))

{ applying ones }
.
.
.
> ones = 1 : ones
> ones
{ applying ones }
1 : ones
{ applying ones }
1 : (1 : ones )
{ applying ones }
1 : (1 : (1 : ones))
[1, 1, 1, 1, 1, 1, 1, 1, 1…]
Lazy
Prelude> list = 1 : 2 : []
> ones = 1 : ones
> ones
{ applying ones }
1 : ones
{ applying ones }
1 : (1 : ones )
{ applying ones }
1 : (1 : (1 : ones))
[1, 1, 1, 1, 1, 1, 1, 1, 1…]
Call by name
> head ones
{ applying ones }
head (1 : ones)

{ applying head }
1
Immutability
> combine a b = a ++ b
> combine [1,2,3] [4]
[1,2,3,4]
> let x = [1,2,3]
> combine x [4]
[1,2,3,4]

> x
[1,2,3]

> drop 1 x
[2,3]

> x
[1,2,3]
Referential Transparency
> incr a = a + 1
> incr 6
7
Breaking Ref Transparency
class OrderCalculator {
Order _order;
public Calculator (Order order){

_order = order;
}
public void applyDiscount() {

_order.total *= 0.90;
}
public void applyDeliveryTax() {
_order.total += 10;
}
public double getTotal() {
return _order.total;
}
}
// set order total
Order o = new Order(100);
OrderCalculator oc = new
OrderCalculator(o);
oc.applyDeliveryTax();
oc.applyDiscount();
oc.getTotal(); //99
o = new Order(100);
oc = new
OrderCalculator(o);
oc.applyDiscount();
oc.applyDeliveryTax();
oc.getTotal(); //100
Pure
1. The function always evaluates the same result value given the same
argument value(s). The function result value cannot depend on any hidden
information or state that may change while program execution proceeds or
between different executions of the program, nor can it depend on any external
input from I/O devices.

2. Evaluation of the result does not cause any semantically observable side
effect or output, such as mutation of mutable objects or output to I/O devices.
read
data
write
data
raise
exception
change
state
…
Monads
A monad is a way to structure computations in terms of values and
sequences of computations using those values.

It is a parameterized type m that supports return and bind functions of the
specified types.
class Monad m where

return :: a -> ma

(>>=) :: ma -> (a -> mb) -> mb
It allows computation to be isolated from side-effects and non-
determinism.
More?
Enjoy this track :)
Programming in Haskell - Graham Hutton
Real World Haskell - http://book.realworldhaskell.org/read/
Learn You a Haskell for Great Good - http://learnyouahaskell.com
A Gentle Introduction to Haskell - https://www.haskell.org/tutorial/

Introduction to Functional Programming - Erik Meijer - edX
Don’t Fear the Monad (search on youtube) - Brian Beckman
Globalcode	–	Open4education
Thanks!
http://www.slideshare.net/rpepato
@rpepato

More Related Content

What's hot

Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
stasimus
 
関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)
riue
 

What's hot (20)

Functional programming with haskell
Functional programming with haskellFunctional programming with haskell
Functional programming with haskell
 
18. Java associative arrays
18. Java associative arrays18. Java associative arrays
18. Java associative arrays
 
Python Cheat Sheet
Python Cheat SheetPython Cheat Sheet
Python Cheat Sheet
 
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
 
Collection Core Concept
Collection Core ConceptCollection Core Concept
Collection Core Concept
 
Python : Dictionaries
Python : DictionariesPython : Dictionaries
Python : Dictionaries
 
Java arrays
Java   arraysJava   arrays
Java arrays
 
関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)
 
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
 
Python programming -Tuple and Set Data type
Python programming -Tuple and Set Data typePython programming -Tuple and Set Data type
Python programming -Tuple and Set Data type
 
Map, Reduce and Filter in Swift
Map, Reduce and Filter in SwiftMap, Reduce and Filter in Swift
Map, Reduce and Filter in Swift
 
The java language cheat sheet
The java language cheat sheetThe java language cheat sheet
The java language cheat sheet
 
19. Java data structures algorithms and complexity
19. Java data structures algorithms and complexity19. Java data structures algorithms and complexity
19. Java data structures algorithms and complexity
 
Mementopython3 english
Mementopython3 englishMementopython3 english
Mementopython3 english
 
A tour of Python
A tour of PythonA tour of Python
A tour of Python
 
Array
ArrayArray
Array
 
Postgresql 9.3 overview
Postgresql 9.3 overviewPostgresql 9.3 overview
Postgresql 9.3 overview
 
07. Arrays
07. Arrays07. Arrays
07. Arrays
 
Introducción a Elixir
Introducción a ElixirIntroducción a Elixir
Introducción a Elixir
 
Java cheatsheet
Java cheatsheetJava cheatsheet
Java cheatsheet
 

Viewers also liked

METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...
METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...
METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...
Roberto Pepato
 

Viewers also liked (9)

Continuous Inspection - Uma abordagem efetiva para melhoria contínua da quali...
Continuous Inspection - Uma abordagem efetiva para melhoria contínua da quali...Continuous Inspection - Uma abordagem efetiva para melhoria contínua da quali...
Continuous Inspection - Uma abordagem efetiva para melhoria contínua da quali...
 
Adding where to your ruby apps
Adding where to your ruby appsAdding where to your ruby apps
Adding where to your ruby apps
 
Be Agile, Stay Agile
Be Agile, Stay AgileBe Agile, Stay Agile
Be Agile, Stay Agile
 
Adding where to your ruby apps lt - (q con)
Adding where to your ruby apps   lt -  (q con)Adding where to your ruby apps   lt -  (q con)
Adding where to your ruby apps lt - (q con)
 
An investigation of extreme programming practices and its impact on software ...
An investigation of extreme programming practices and its impact on software ...An investigation of extreme programming practices and its impact on software ...
An investigation of extreme programming practices and its impact on software ...
 
METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...
METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...
METACOM - Um Método para Análise de Correlação entre Métricas de Produto de S...
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
 

Similar to Haskell 101

Problem 1 Show the comparison of runtime of linear search and binar.pdf
Problem 1 Show the comparison of runtime of linear search and binar.pdfProblem 1 Show the comparison of runtime of linear search and binar.pdf
Problem 1 Show the comparison of runtime of linear search and binar.pdf
ebrahimbadushata00
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
Dmitry Buzdin
 
TI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsTI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class Functions
Eelco Visser
 
C++ Searching & Sorting5. Sort the following list using the select.pdf
C++ Searching & Sorting5. Sort the following list using the select.pdfC++ Searching & Sorting5. Sort the following list using the select.pdf
C++ Searching & Sorting5. Sort the following list using the select.pdf
Rahul04August
 

Similar to Haskell 101 (20)

Java VS Python
Java VS PythonJava VS Python
Java VS Python
 
Javascript
JavascriptJavascript
Javascript
 
Functional Programming for OO Programmers (part 2)
Functional Programming for OO Programmers (part 2)Functional Programming for OO Programmers (part 2)
Functional Programming for OO Programmers (part 2)
 
Problem 1 Show the comparison of runtime of linear search and binar.pdf
Problem 1 Show the comparison of runtime of linear search and binar.pdfProblem 1 Show the comparison of runtime of linear search and binar.pdf
Problem 1 Show the comparison of runtime of linear search and binar.pdf
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Spark workshop
Spark workshopSpark workshop
Spark workshop
 
Clojure basics
Clojure basicsClojure basics
Clojure basics
 
Functions in advanced programming
Functions in advanced programmingFunctions in advanced programming
Functions in advanced programming
 
The Ring programming language version 1.7 book - Part 35 of 196
The Ring programming language version 1.7 book - Part 35 of 196The Ring programming language version 1.7 book - Part 35 of 196
The Ring programming language version 1.7 book - Part 35 of 196
 
Seminar PSU 10.10.2014 mme
Seminar PSU 10.10.2014 mmeSeminar PSU 10.10.2014 mme
Seminar PSU 10.10.2014 mme
 
Monadologie
MonadologieMonadologie
Monadologie
 
The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.8 book - Part 37 of 202The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.8 book - Part 37 of 202
 
TI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsTI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class Functions
 
Functions In Scala
Functions In Scala Functions In Scala
Functions In Scala
 
The Ring programming language version 1.5.2 book - Part 26 of 181
The Ring programming language version 1.5.2 book - Part 26 of 181The Ring programming language version 1.5.2 book - Part 26 of 181
The Ring programming language version 1.5.2 book - Part 26 of 181
 
The secrets of inverse brogramming
The secrets of inverse brogrammingThe secrets of inverse brogramming
The secrets of inverse brogramming
 
Array Cont
Array ContArray Cont
Array Cont
 
The Ring programming language version 1.5.1 book - Part 30 of 180
The Ring programming language version 1.5.1 book - Part 30 of 180The Ring programming language version 1.5.1 book - Part 30 of 180
The Ring programming language version 1.5.1 book - Part 30 of 180
 
C++ Searching & Sorting5. Sort the following list using the select.pdf
C++ Searching & Sorting5. Sort the following list using the select.pdfC++ Searching & Sorting5. Sort the following list using the select.pdf
C++ Searching & Sorting5. Sort the following list using the select.pdf
 
Lecture#6 functions in c++
Lecture#6 functions in c++Lecture#6 functions in c++
Lecture#6 functions in c++
 

Recently uploaded

Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
FIDO Alliance
 

Recently uploaded (20)

Design Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptxDesign Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptx
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptx
 
Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data Science
 
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
 
Event-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream ProcessingEvent-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream Processing
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
 
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdfIntroduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
 
Google I/O Extended 2024 Warsaw
Google I/O Extended 2024 WarsawGoogle I/O Extended 2024 Warsaw
Google I/O Extended 2024 Warsaw
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
Where to Learn More About FDO _ Richard at FIDO Alliance.pdf
Where to Learn More About FDO _ Richard at FIDO Alliance.pdfWhere to Learn More About FDO _ Richard at FIDO Alliance.pdf
Where to Learn More About FDO _ Richard at FIDO Alliance.pdf
 
Collecting & Temporal Analysis of Behavioral Web Data - Tales From The Inside
Collecting & Temporal Analysis of Behavioral Web Data - Tales From The InsideCollecting & Temporal Analysis of Behavioral Web Data - Tales From The Inside
Collecting & Temporal Analysis of Behavioral Web Data - Tales From The Inside
 
Top 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development CompaniesTop 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development Companies
 
How we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdfHow we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdf
 
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on ThanabotsContinuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
 
State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!
 
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdfThe Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
 
TopCryptoSupers 12thReport OrionX May2024
TopCryptoSupers 12thReport OrionX May2024TopCryptoSupers 12thReport OrionX May2024
TopCryptoSupers 12thReport OrionX May2024
 
The Metaverse: Are We There Yet?
The  Metaverse:    Are   We  There  Yet?The  Metaverse:    Are   We  There  Yet?
The Metaverse: Are We There Yet?
 
Intro in Product Management - Коротко про професію продакт менеджера
Intro in Product Management - Коротко про професію продакт менеджераIntro in Product Management - Коротко про професію продакт менеджера
Intro in Product Management - Коротко про професію продакт менеджера
 

Haskell 101

  • 1. Globalcode – Open4education Trilha – Programação Funcional Roberto Pepato Mellado Engenheiro de Software
  • 3. “Haskell is a computer programming language. In particular, it is a p o l y m o r p h i c a l l y s t a t i c a l l y t y p e d , l a z y, p u r e l y functional language, quite different from most other programming languages.” https://wiki.haskell.org/Introduction Function Application Immutability Currying Category Theory Monads Function Composition …
  • 6. Data? Code? int x = 2; private int incr (int seed) { return seed + 1; } Code + Data Prelude> x = 2 Prelude> incr x = x + 1 Code is Data Functions as first class citizens
  • 7. Static Typing Prelude> x = 2 -- :type or :t 
 Prelude> :t x
 x :: Num t => t Prelude> incr x = x + 1 Prelude> :t incr
 incr :: Num a => a -> a
  • 8. Basic Types Type A collection of related values Bool Logical values: True, False. Char Single Characters String Strings of characters Int Fixed-point precision integers Integer Arbitrary precision integers Float Single-precision floating points List Sequence of elements of the same type Tuple A finite sequence of components of possibly different types e.g. (Bool -> Bool) All Bool to Bool function mappings
  • 9. Function Application In mathematics… f (a, b) + c d Prelude> adder a = a + 1 Prelude> tripler c = c * 3 Prelude> adder 2 3 Prelude> adder (tripler 4) 13 f a b + c * d ((f a) b) + c * d
  • 10. Currying Prelude> sum a b = a + b Prelude> :t sum
 sum :: Num a => a -> a -> a Prelude> square x = x * x Prelude> :t square
 square :: Num a => a -> a In haskell, functions are curried
  • 11. Currying Prelude> :t map map :: (a -> b) -> [a] -> [b] Prelude> map (+ 1) [1,2,3,4,5] [2,3,4,5,6] Prelude> squares = map square :t squares squares :: Num b => [b] -> [b] squares [1,2,3,4,5] [1,4,9,16,25]
  • 12. High Order Functions Prelude> twice f x = f (f x) Prelude> twice (*2) 3
 12 Prelude> twice reverse [1,2,3] [1,2,3] Sum of the squares of all even numbers from 1 to 100? sum: adds items from a list
 square: already defined
 filter: filter list elements
 even: true if a number is even, false otherwise Prelude> sumsqreven ns = sum(map (square) (filter even ns)) Prelude> sumsqreven [1..100] 171700
  • 13. Function Composition Prelude> double x = x + x Prelude> triple x = double x + x Prelude> sixTimes = double . triple Prelude> sixTimes 5 30
  • 14. Function Composition Prelude> fsum = sum . map (square) . filter even Prelude> [1..100] [1,2,3,4,5,6,7,…] Prelude> fsum [1..100] 171700 Prelude> verifyStatus = … Prelude> checkCredit = … Prelude> validate = … Prelude> generateOrder = … Prelude> sendEmail = … Prelude> applyTransaction = sendEmail . generateOrder . validate . checkCredit . verifyStatus
  • 15. Pattern Matching Prelude> head [1..10] 1 Prelude> tail [1..10] [2,3,4,5,6,7,8,9,10] Prelude> length [] = 0 Prelude> length (_:xs) = 1 + length xs Prelude> length [] 0 Prelude> length [2,2,2,2,2,2,2] 7 Prelude> cabeca (x:xs) = x 1 Prelude> cauda(x:xs) = xs [2,3,4,5,6,7,8,9,10] Prelude> cabeca (x:_) = x Prelude> cauda(_:xs) = xs
  • 16. Pattern Matching Prelude> check (403, ip, timestamp) = ip Prelude> check (_, _, _) = “ok” Prelude> analyzelog xs = [check x | x <- xs] Prelude> analyzelog [
 (200, “200.251.192.13”, 1467313969905), 
 (403, “200.168.175.28”, 1467314005735), 
 (500, “201.52.164.78, 1467314029977) ] “ok” “200.168.175.28” “ok”
  • 17. Lazy Prelude> mult (x, y) = x * y Call by value > mult (1+2, 3+4) { applying + } mult (3, 3 + 4) { applying + } mult (3, 7) { applying mult } 3 * 7 { applying * } 21 Call by name > mult (1+2, 3+4) { applying mult } (1+2) * (3+4) { applying + } 3 * (3 + 4) { applying + } 3 * 7 { applying * } 21 Haskell strategy is based on call-by-name
  • 18. Lazy Prelude> list = 1 : 2 : [] [1,2] Call by value > head ones { applying ones } head (1 : ones)
 { applying ones } head (1 : (1 : ones))
 { applying ones } . . . > ones = 1 : ones > ones { applying ones } 1 : ones { applying ones } 1 : (1 : ones ) { applying ones } 1 : (1 : (1 : ones)) [1, 1, 1, 1, 1, 1, 1, 1, 1…]
  • 19. Lazy Prelude> list = 1 : 2 : [] > ones = 1 : ones > ones { applying ones } 1 : ones { applying ones } 1 : (1 : ones ) { applying ones } 1 : (1 : (1 : ones)) [1, 1, 1, 1, 1, 1, 1, 1, 1…] Call by name > head ones { applying ones } head (1 : ones)
 { applying head } 1
  • 20. Immutability > combine a b = a ++ b > combine [1,2,3] [4] [1,2,3,4] > let x = [1,2,3] > combine x [4] [1,2,3,4]
 > x [1,2,3]
 > drop 1 x [2,3]
 > x [1,2,3]
  • 21. Referential Transparency > incr a = a + 1 > incr 6 7
  • 22. Breaking Ref Transparency class OrderCalculator { Order _order; public Calculator (Order order){
 _order = order; } public void applyDiscount() {
 _order.total *= 0.90; } public void applyDeliveryTax() { _order.total += 10; } public double getTotal() { return _order.total; } } // set order total Order o = new Order(100); OrderCalculator oc = new OrderCalculator(o); oc.applyDeliveryTax(); oc.applyDiscount(); oc.getTotal(); //99 o = new Order(100); oc = new OrderCalculator(o); oc.applyDiscount(); oc.applyDeliveryTax(); oc.getTotal(); //100
  • 23. Pure 1. The function always evaluates the same result value given the same argument value(s). The function result value cannot depend on any hidden information or state that may change while program execution proceeds or between different executions of the program, nor can it depend on any external input from I/O devices.
 2. Evaluation of the result does not cause any semantically observable side effect or output, such as mutation of mutable objects or output to I/O devices. read data write data raise exception change state …
  • 24. Monads A monad is a way to structure computations in terms of values and sequences of computations using those values.
 It is a parameterized type m that supports return and bind functions of the specified types. class Monad m where
 return :: a -> ma
 (>>=) :: ma -> (a -> mb) -> mb It allows computation to be isolated from side-effects and non- determinism.
  • 25. More? Enjoy this track :) Programming in Haskell - Graham Hutton Real World Haskell - http://book.realworldhaskell.org/read/ Learn You a Haskell for Great Good - http://learnyouahaskell.com A Gentle Introduction to Haskell - https://www.haskell.org/tutorial/
 Introduction to Functional Programming - Erik Meijer - edX Don’t Fear the Monad (search on youtube) - Brian Beckman