Root Cause: Failure to use metric
units in the coding of a
trajectory model.
Slide 8
Slide 8 text
[...] the navigation software
algorithm therefore,
underestimated
the effect on the spacecraft
trajectory by a factor of 4.45 [...]
Slide 9
Slide 9 text
An erroneous trajectory was
computed using this incorrect
data.
Slide 10
Slide 10 text
I'M NOT BUILDING
SPACECRAFT
Slide 11
Slide 11 text
PLAYING FAST AND LOOSE
WITH NUMBERS
Slide 12
Slide 12 text
3 KINDS OF MISTAKES
1. Argument order
2. Unit conversion
3. Invalid operation
Slide 13
Slide 13 text
ARGUMENT ORDER ERROR
Slide 14
Slide 14 text
ARGUMENT ORDER ERROR
speed : Float -> Float -> Float
speed distance time =
distance / time
Slide 15
Slide 15 text
ARGUMENT ORDER ERROR
distance = 10
time = 5
-- WHICH ONE?
speed distance time
speed time distance
Slide 16
Slide 16 text
HOW CAN WE MAKE FEWER
OF THESE MISTAKES?
Slide 17
Slide 17 text
COMMUNICATION
Slide 18
Slide 18 text
CONFUSING
Float -> Float -> Float
Slide 19
Slide 19 text
WHAT DO THESE NUMBERS
REPRESENT?
Slide 20
Slide 20 text
FUNDAMENTALLY DIFFERENT
QUANTITIES
Slide 21
Slide 21 text
WHAT ABOUT THIS
Meter -> Second -> MeterPerSecond
Slide 22
Slide 22 text
TYPE ALIASES
Slide 23
Slide 23 text
PROVIDE ALTERNATE NAME
FOR EXISTING TYPES
Slide 24
Slide 24 text
COMPILER CAN'T TELL THE DIFFERENCE
Float -> Float -> Float
-- SAME AS
Meter -> Second -> MeterPerSecond
Slide 25
Slide 25 text
TYPE ALIASES ARE FOR
HUMANS ONLY
Slide 26
Slide 26 text
[the Elm compiler] has my back
when I make a dumb mistake. It
brings joy
into front-end programming.
- Joël Quenneville
Slide 27
Slide 27 text
WHAT IF THE COMPILER
COULD HELP US?
Slide 28
Slide 28 text
COMMUNICATION
Slide 29
Slide 29 text
CUSTOM TYPES
type Meter
= Meter Float
type Second
= Second Float
type MetersPerSecond
= MetersPerSecond Float
Slide 30
Slide 30 text
CAN'T DO MATH ON THESE
Slide 31
Slide 31 text
speed : Meter -> Second -> MetersPerSecond
speed (Meter m) (Second s) =
MetersPerSecond (m / s)
Slide 32
Slide 32 text
ARGUMENT ORDER ERROR - TYPED
distance = Meter 10
time = Second 5
-- Wrong argument order
myVal = speed time distance
Slide 33
Slide 33 text
The 1st argument to `speed` is not what I expect:
21| myVal = speed time distance
^^^^
This `time` value is a:
Second
But `speed` needs the 1st argument to be:
Meter
Slide 34
Slide 34 text
3 KINDS OF MISTAKES
1. Argument order
2. Unit conversion
3. Invalid operation
Slide 35
Slide 35 text
UNIT CONVERSION ERROR
Slide 36
Slide 36 text
UNIT CONVERSION ERROR
minutes = 40
hours = 2
total = minutes + hours
-- RETURNS 42
-- SHOULD RETURN 160 OR 2.67
WHAT KIND OF
QUANTITIES DO THESE
NUMBERS REPRESENT?
Slide 43
Slide 43 text
DIFFERENT VARIATIONS OF
THE SAME QUANTITY
Slide 44
Slide 44 text
SHARE A TYPE
add : Time -> Time -> Time
Slide 45
Slide 45 text
OPAQUE TYPES
Slide 46
Slide 46 text
OPAQUE TYPES
module Time exposing (Time)
type Time = Time Float
Slide 47
Slide 47 text
OPAQUE TYPES
module Time exposing (Time, fromMinutes)
-- OTHER STUFF
fromMinutes : Float -> Time
fromMinutes mins =
Time mins
Slide 48
Slide 48 text
OPAQUE TYPES
module Time exposing (Time, fromMinutes, fromHours)
-- OTHER STUFF
fromHours : Float -> Time
fromHours hrs =
Time (hrs * 60)
Slide 49
Slide 49 text
OPAQUE TYPES
module Time exposing (Time, fromMinutes, fromHours, add)
-- OTHER STUFF
add : Time -> Time -> Time
add (Time t1) (Time t2) =
Time (t1 + t2)
Slide 50
Slide 50 text
OPAQUE TYPES
module Time exposing (Time, fromMinutes, fromHours, add)
-- OTHER STUFF
inHours : Time -> Float
inHours (Time t)
toFloat t / 60
The 2nd argument to `add` is not what I expect:
29| add usd eur
^^^
This `eur` value is a:
Currency Eur
But `add` needs the 2nd argument to be:
Currency Usd
Slide 77
Slide 77 text
CONSTRAINT ENFORCED!
Slide 78
Slide 78 text
CONVERSION - PHANTOM TYPE X 2
type ConversionRate from to
= ConversionRate Float
convert : ConversionRate from to -> Currency from -> Currency to
convert (ConversionRate rate) (Currency c) =
Currency (rate * c)