Scala <> Haskell
Introducing and comparing both languages.
Slide 2
Slide 2 text
• The Basics
• Type level programming
• Libraries/Frameworks/
Community
Slide 3
Slide 3 text
The Basics
1. Two FP styles
2. Sum types
3. Pattern matching
4. Functions
5. Imperative constructions
6. Evaluation
Slide 4
Slide 4 text
1. Two FP styles
Slide 5
Slide 5 text
Everything is an
object
Slide 6
Slide 6 text
No content
Slide 7
Slide 7 text
There are only functions
and constants
Slide 8
Slide 8 text
No content
Slide 9
Slide 9 text
2. Sum/co-product
types
Slide 10
Slide 10 text
A product type
Slide 11
Slide 11 text
A sum/co-product type
Slide 12
Slide 12 text
A sum/co-product type
This approach introduces two new types:
- True.type
- False.type
Slide 13
Slide 13 text
A product type
Slide 14
Slide 14 text
A sum/co-product type
Slide 15
Slide 15 text
A sum/co-product type
There is only one type:
- Boolean
and two constants:
- True’
- False’
Slide 16
Slide 16 text
3. Pattern matching
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
Product/Sum types are dual of
pattern matching, the first
constructs data, the second de-
constructs data.
Slide 20
Slide 20 text
4. Functions
Slide 21
Slide 21 text
Lambdas
Slide 22
Slide 22 text
No content
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
Functions
Slide 25
Slide 25 text
No content
Slide 26
Slide 26 text
No content
Slide 27
Slide 27 text
Curried functions
Slide 28
Slide 28 text
The type of a function
A => B
Slide 29
Slide 29 text
The type of a function
A => B
B = C => D
Slide 30
Slide 30 text
The type of a curried function
A => C => D
Slide 31
Slide 31 text
A curried function
Slide 32
Slide 32 text
A curried function (named syntax)
Slide 33
Slide 33 text
The type of a function
a -> b
Slide 34
Slide 34 text
The type of a function
a -> b
b = c -> d
Slide 35
Slide 35 text
The type of a curried function
a -> c -> d
Slide 36
Slide 36 text
A curried function
Slide 37
Slide 37 text
A curried function (named syntax)
Slide 38
Slide 38 text
Multi-argument
functions
Slide 39
Slide 39 text
Functions only accept one argument
and return one result. Let’s see how
can we emulate functions that
receive more than one argument.
Slide 40
Slide 40 text
The type of a multi-arg function
(A,B,…) => D
Slide 41
Slide 41 text
No content
Slide 42
Slide 42 text
Shorter syntax
Slide 43
Slide 43 text
Even shorter syntax
Slide 44
Slide 44 text
The type of a multi-arg function
(a,b,…) -> d
Slide 45
Slide 45 text
No content
Slide 46
Slide 46 text
Even shorter syntax
Slide 47
Slide 47 text
Thanks to pattern matching we
can syntactically emulate multi-
argument functions
Slide 48
Slide 48 text
Curried functions are more common
in Haskell, while multi-argument
functions are more common in Scala
Slide 49
Slide 49 text
Curried functions allow partial
function application
Slide 50
Slide 50 text
No content
Slide 51
Slide 51 text
No content
Slide 52
Slide 52 text
No content
Slide 53
Slide 53 text
5. Imperative
constructions
Slide 54
Slide 54 text
Unrestricted side-effects
Slide 55
Slide 55 text
Side-effects only inside IO type
Slide 56
Slide 56 text
6. Evaluation
Slide 57
Slide 57 text
Strict evaluation by default
with lazy evaluation as an
option
Slide 58
Slide 58 text
Strict
Slide 59
Slide 59 text
Lazy
Slide 60
Slide 60 text
Lazy evaluation by default
with strict evaluation as an
option
Slide 61
Slide 61 text
Lazy (non-strict semantics)
Slide 62
Slide 62 text
Strict
Slide 63
Slide 63 text
Evaluation-related
keywords particular to
Scala
Slide 64
Slide 64 text
Strict evaluation
Slide 65
Slide 65 text
Lazy evaluation
Slide 66
Slide 66 text
Haskell’s lazy-evaluation
Slide 67
Slide 67 text
Non-strict evaluation
Slide 68
Slide 68 text
Type-level programming
1. Type inference
2. Kind inference
3. Type classes
4. Multi-param type classes
5. Monad transformers
Slide 69
Slide 69 text
1. Type inference
Slide 70
Slide 70 text
Local: variables and
function return types
Slide 71
Slide 71 text
No content
Slide 72
Slide 72 text
No content
Slide 73
Slide 73 text
No content
Slide 74
Slide 74 text
No content
Slide 75
Slide 75 text
Global: almost all
types are calculated
Slide 76
Slide 76 text
No content
Slide 77
Slide 77 text
No content
Slide 78
Slide 78 text
No content
Slide 79
Slide 79 text
Type Inference
Less polymorphic More permissive
Haskell
Scala
Hindley-Milner
Slide 80
Slide 80 text
Things that make Scala’s type system more powerful (hence less
type inference):
- sub typing polymorphism
- type lambdas
- …
Recommended reading (the comments section):
http://pchiusano.blogspot.com.es/2011/05/making-most-of-
scalas-extremely-limited.html
Slide 81
Slide 81 text
2. Kind inference
Slide 82
Slide 82 text
No content
Slide 83
Slide 83 text
No content
Slide 84
Slide 84 text
No content
Slide 85
Slide 85 text
No content
Slide 86
Slide 86 text
3. Type classes
Slide 87
Slide 87 text
The expression problem
Operation\Data Data1 Data2 New data easy in OOP
/ difficult in FP
Operation1
Operation2
Operation3
New operation easy
in FP / hard in OOP
Slide 88
Slide 88 text
No content
Slide 89
Slide 89 text
No content
Slide 90
Slide 90 text
Adding a new operation
Slide 91
Slide 91 text
Adding a new data type
Slide 92
Slide 92 text
No content
Slide 93
Slide 93 text
No content
Slide 94
Slide 94 text
No content
Slide 95
Slide 95 text
Adding a new operation
Slide 96
Slide 96 text
Adding a new data type
Slide 97
Slide 97 text
No content
Slide 98
Slide 98 text
4. Multi-param type
classes
Slide 99
Slide 99 text
No content
Slide 100
Slide 100 text
How can we constraint the type
parameters to allow more
polymorphism?
Slide 101
Slide 101 text
The solution is to use functional
dependencies (inspired by
relational databases)
Slide 102
Slide 102 text
With functional dependencies
Slide 103
Slide 103 text
No content
Slide 104
Slide 104 text
5. Monad
transformers
Slide 105
Slide 105 text
No content
Slide 106
Slide 106 text
No content
Slide 107
Slide 107 text
No content
Slide 108
Slide 108 text
Type-level programming
1. Type inference
2. Kind inference
3. Type classes
4. Multi-param type classes
5. Monad transformers
My view is that both languages are
fantastic, Scala sacrifices type
inference and some type safety in
exchange of more power. Haskell tries
to keep a core with good type
inference and type safety even if that
incurs in a less powerful type system