SlideShare a Scribd company logo
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

PDF
Python 2.5 reference card (2009)
PDF
Python3 cheatsheet
PDF
Beginning Haskell, Dive In, Its Not That Scary!
PDF
Python_ 3 CheatSheet
PDF
Python For Data Science Cheat Sheet
PDF
Cheat sheet python3
PDF
Introduction to haskell
PDF
Python programming : Standard Input and Output
Python 2.5 reference card (2009)
Python3 cheatsheet
Beginning Haskell, Dive In, Its Not That Scary!
Python_ 3 CheatSheet
Python For Data Science Cheat Sheet
Cheat sheet python3
Introduction to haskell
Python programming : Standard Input and Output

What's hot (20)

PDF
Functional programming with haskell
PPTX
18. Java associative arrays
PDF
Python Cheat Sheet
PPTX
Introduction to Monads in Scala (1)
PPT
Collection Core Concept
PPTX
Java arrays
KEY
関数潮流(Function Tendency)
KEY
Haskellで学ぶ関数型言語
PPTX
Python programming -Tuple and Set Data type
PDF
Map, Reduce and Filter in Swift
PDF
The java language cheat sheet
PPTX
19. Java data structures algorithms and complexity
PDF
Mementopython3 english
PDF
A tour of Python
DOCX
Array
PDF
Postgresql 9.3 overview
PPTX
07. Arrays
PDF
Introducción a Elixir
PDF
Java cheatsheet
Functional programming with haskell
18. Java associative arrays
Python Cheat Sheet
Introduction to Monads in Scala (1)
Collection Core Concept
Java arrays
関数潮流(Function Tendency)
Haskellで学ぶ関数型言語
Python programming -Tuple and Set Data type
Map, Reduce and Filter in Swift
The java language cheat sheet
19. Java data structures algorithms and complexity
Mementopython3 english
A tour of Python
Array
Postgresql 9.3 overview
07. Arrays
Introducción a Elixir
Java cheatsheet
Ad

Viewers also liked (9)

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

Similar to Haskell 101 (20)

PDF
Java VS Python
PDF
Javascript
PDF
Functional Programming for OO Programmers (part 2)
PDF
Problem 1 Show the comparison of runtime of linear search and binar.pdf
PDF
Refactoring to Macros with Clojure
PDF
Spark workshop
ODP
Clojure basics
PPTX
Functions in advanced programming
PDF
The Ring programming language version 1.7 book - Part 35 of 196
PPTX
Python list tuple dictionary .pptx
PPTX
Seminar PSU 10.10.2014 mme
PDF
Monadologie
PDF
The Ring programming language version 1.8 book - Part 37 of 202
PDF
TI1220 Lecture 6: First-class Functions
PPTX
世预赛买球-世预赛买球竞彩平台-世预赛买球竞猜平台|【​网址​🎉ac123.net🎉​】
PPTX
美洲杯买球-美洲杯买球怎么押注-美洲杯买球押注怎么玩|【​网址​🎉ac99.net🎉​】
PPTX
欧洲杯足彩-欧洲杯足彩线上体育买球-欧洲杯足彩买球推荐网站|【​网址​🎉ac55.net🎉​】
PPTX
欧洲杯下注-欧洲杯下注买球网-欧洲杯下注买球网站|【​网址​🎉ac10.net🎉​】
PPTX
世预赛买球-世预赛买球比赛投注-世预赛买球比赛投注官网|【​网址​🎉ac10.net🎉​】
PPTX
世预赛投注-世预赛投注投注官网app-世预赛投注官网app下载|【​网址​🎉ac123.net🎉​】
Java VS Python
Javascript
Functional Programming for OO Programmers (part 2)
Problem 1 Show the comparison of runtime of linear search and binar.pdf
Refactoring to Macros with Clojure
Spark workshop
Clojure basics
Functions in advanced programming
The Ring programming language version 1.7 book - Part 35 of 196
Python list tuple dictionary .pptx
Seminar PSU 10.10.2014 mme
Monadologie
The Ring programming language version 1.8 book - Part 37 of 202
TI1220 Lecture 6: First-class Functions
世预赛买球-世预赛买球竞彩平台-世预赛买球竞猜平台|【​网址​🎉ac123.net🎉​】
美洲杯买球-美洲杯买球怎么押注-美洲杯买球押注怎么玩|【​网址​🎉ac99.net🎉​】
欧洲杯足彩-欧洲杯足彩线上体育买球-欧洲杯足彩买球推荐网站|【​网址​🎉ac55.net🎉​】
欧洲杯下注-欧洲杯下注买球网-欧洲杯下注买球网站|【​网址​🎉ac10.net🎉​】
世预赛买球-世预赛买球比赛投注-世预赛买球比赛投注官网|【​网址​🎉ac10.net🎉​】
世预赛投注-世预赛投注投注官网app-世预赛投注官网app下载|【​网址​🎉ac123.net🎉​】

Recently uploaded (20)

PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Modernizing your data center with Dell and AMD
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Cloud computing and distributed systems.
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPT
Teaching material agriculture food technology
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
Review of recent advances in non-invasive hemoglobin estimation
Understanding_Digital_Forensics_Presentation.pptx
Modernizing your data center with Dell and AMD
Encapsulation_ Review paper, used for researhc scholars
MYSQL Presentation for SQL database connectivity
Cloud computing and distributed systems.
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
A Presentation on Artificial Intelligence
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Diabetes mellitus diagnosis method based random forest with bat algorithm
Dropbox Q2 2025 Financial Results & Investor Presentation
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Advanced methodologies resolving dimensionality complications for autism neur...
Teaching material agriculture food technology
Building Integrated photovoltaic BIPV_UPV.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing

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