Elm Programming Language
Andrew Schutt

Hello!


Dialects

Dialects




Dialects



Frameworks







Dialects



Frameworks







Packaging


Dialects



Frameworks







Packaging



Utilities



Dialect
Framework
Packaging
Utilities
It's all Elm!
What is Elm?
Elm

Created By @czaplic


compiles to
https://guide.elm-lang.org/install.html


compiles to
> elm make Main.elm --output elm.js
Main.elm
elm.js
Functional
Pure Functions
Pure Functions
> add 3 5 -- 8
> add 3 5 -- 8
> add 3 5 -- 8
Declarative
var numbers = [1, 2, 3, 4, 5];
function doubleNumbers (numbers) {
const doubled = [];
const l = numbers.length;
for (let i = 0; i < l; i++) {
doubled.push(numbers[i] * 2);
};
return doubled;
};
Imperative Example
myList = [1, 2, 3, 4, 5]
double n = n * 2
doubleNumbers list =
List.map double list
doubleNumbers myList
Declarative Example
Immutable

By Ptelea - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=16572537
Why use Elm?
Performance

* https://elm-lang.org/blog/small-assets-without-the-headache
* https://elm-lang.org/blog/blazing-fast-html-round-two

Performance
> elm make --optimize
"No runtime exceptions"
Compiler
Compiler Errors

Error Handling
Error Handling
function fetchCatz() {
return fetch('http://www.funnycatpix.com/')
.then(r => r.json())
.then(photo => { /* handle photo */ });
}
function fetchCatz() {
return fetch('http://www.funnycatpix.com/')
.then(r => r.json())
.then(photo => { /* handle photo */ });
}
Error Handling
No catch statement!
fetchCatz : Cmd Msg
fetchCatz =
Http.get
{ url = "http://www.funnycatpix.com/"
, expect = Http.expectJson LoadCatz photoDecoder }
Error Handling
Strong Static Typing
score : Int
score = 0
greeting : String
greeting = "Hello!"
needCoffee : Bool
needCoffee = True
numbers : List
numbers = [1, 2, 3, 4]
Static Types
By Melburnian - Own work, CC BY 2.5, https://commons.wikimedia.org/w/index.php?curid=1287428

Syntax and Features
Functions
Functions
isNegative n = n < 0
Functions
isNegative n = n < 0
isNegative 4
False
isNegative -8
True
isNegative (-2 * -11)
False
Anonymous Functions
\n -> n < 0
(\n -> n < 0) 4
False
(\n -> n < 0) -8
True
(\n -> n < 0) (-2 * -11)
False
Function Currying
add x y z = x + y + z
add 1 2 3
((add 1) 2) 3
add1 = add 1
add2 = add1 2
add2 3 -- 6
Currying
Piping
format str = String.trim (String.repeat 4 (String.toUpper str))
Piping
format str =
str
|> String.toUpper
|> String.repeat 4
|> String.trim
Annotations
Annotations
-- doubles ints and adds two results
doSomething x y =
(x * 2) + (y * 2)
Annotations
-- doubles ints and adds two results
doSomething x y =
(x * 2) + (y * 2)
Annotations
-- doubles ints and adds two results
doSomething x y =
(x * 2.0) + (y * 2.0)
Annotations
doSomething : Int -> Int -> Int
doSomething x y =
(x * 2.0) + (y * 2.0)
Annotations
doSomething : Float -> Float -> Float
doSomething x y =
(x * 2.0) + (y * 2.0)
Lists
Lists
numbers = [1, 2, 3, 4]
strings = ["one", "two" "three", "four"]
numsAndStrs = [1, "two", 3, "four"]
Lists
numbers = [1, 2, 3, 4]
strings = ["one", "two" "three", "four"]
numsAndStrs = [1, "two", 3, "four"]

Records
Records
album =
{ title = "Rubber Soul"
, artist = "The Beatles"
, tracks = [1, 2, 3, 4, 5]
}
album.title
"Rubber Soul" : String
Immutable
album.title = "Abbey Road"
{ album | title = "Abbey Road" }
{ title = "Abbey Road"
, artist = "The Beatles"
, tracks = [1, 2, 3, 4, 5]
}
Immutable
album = { title = "Rubber Soul", ... }
abbeyRoad = { album | title = "Abbey Road" }
abbeyRoad
{ title = "Abbey Road", ... }
album
{ title = "Rubber Soul", ... }
Tuples
Tuples
(1)
(1, "two")
(1, "two", 3.0)
(1, "two", 3.0, Four)

Type Aliases
Type Aliases
type alias Pet =
{ name : String
, breed : String
, age : Int
}
dog = Pet "Bunsen" "Dog" 0
puppyBirthday : Pet -> Int
puppyBirthday pet =
pet.age + 1
{ dog | age = puppyBirthday dog }
{ age = 1, breed = "Dog", name = "Bunsen" }
Type Aliases
type alias Pet =
{ name : String
, breed : String
, age : Int
}
dog = Pet "Bunsen" "Dog" 0
puppyBirthday : Pet -> Int
puppyBirthday pet =
pet.age + 1
{ dog | age = puppyBirthday dog }
{ age = 1, breed = "Dog", name = "Bunsen" }
Type Aliases
type alias Pet =
{ name : String
, breed : String
, age : Int
}
dog = Pet "Bunsen" "Dog" 0
puppyBirthday : Pet -> Int
puppyBirthday pet =
pet.age + 1
{ dog | age = puppyBirthday dog }
{ age = 1, breed = "Dog", name = "Bunsen" }
Type Aliases
type alias Pet =
{ name : String
, breed : String
, age : Int
}
dog = Pet "Bunsen" "Dog" 0
puppyBirthday : Pet -> Int
puppyBirthday pet =
pet.age + 1
{ dog | age = puppyBirthday dog }
{ age = 1, breed = "Dog", name = "Bunsen" }
Union Types
Union Types
type Breed = Dog | Cat | Parrot
type alias Pet =
{ name : String
, breed : String
, age : Int
}
Union Types
type Breed = Dog | Cat | Parrot
type alias Pet =
{ name : String
, breed : Breed
, age : Int
}
Union Types
dog = Pet "Bunsen" "Dog" 0
dog = Pet "Bunsen" Dog 0
Case Statements
Case Statements
dog = Pet "Bunsen" Dog 1
cat = Pet "Beaker" Cat 6
talk : Pet -> String
talk pet =
case pet of
Dog ->
"Bark! Bark!"
Cat ->
"Meow! Meow!"
Case Statements
dog = Pet "Bunsen" Dog 1
cat = Pet "Beaker" Cat 6
talk : Pet -> String
talk pet =
case pet of
Dog ->
"Bark! Bark!"
Cat ->
"Meow! Meow!"
Case Statements
dog = Pet "Bunsen" Dog 1
cat = Pet "Beaker" Cat 6
talk : Pet -> String
talk pet =
case pet of
Dog ->
"Bark! Bark!"
Cat ->
"Meow! Meow!"
Case Statements
talk : Pet -> String
talk pet =
case pet of
Dog ->
"Bark! Bark!"
Cat ->
"Meow! Meow!"
Parrot ->
"Squawk! Squawk!
Maybe Type
Maybe Type
type Maybe a
= Just a
| Nothing
Maybe Type
type Maybe a
= Just a
| Nothing
Just 3.14 : Maybe Float
Just "hi" : Maybe String
Just True : Maybe Bool
Nothing : Maybe a
Tooling
Tooling
-
Packages -> elm install
-
Compiler -> elm make
-
REPL -> elm repl
-
Dev Server -> elm reactor
-
Framework -> Elm Architecture
Elm Architecture
Elm Architecture
- Model - state of application
- Update - update your state
- View - display your state
Elm Architecture


Model
Elm Architecture


View
Model
Elm Architecture


View
Model

Elm Architecture


View
Model
Update


Elm Architecture

View
Model
Update


Elm Architecture

View
Model
Update


Elm Architecture

View
Model
Update



Elm Runtime
Elm Architecture
-- MODEL
type alias Model = { ... }
-- UPDATE
type Msg = Reset | ...
update : Msg -> Model -> Model
update msg model =
case msg of
Reset -> ...
...
-- VIEW
view : Model -> Html Msg
view model =
...
Elm Architecture
-- MODEL
type alias Model = { ... }
-- UPDATE
type Msg = Reset | ...
update : Msg -> Model -> Model
update msg model =
case msg of
Reset -> ...
...
-- VIEW
view : Model -> Html Msg
view model =
...
Elm Architecture
-- MODEL
type alias Model = { ... }
-- UPDATE
type Msg = Reset | ...
update : Msg -> Model -> Model
update msg model =
case msg of
Reset -> ...
...
-- VIEW
view : Model -> Html Msg
view model =
...
Elm Architecture
-- MODEL
type alias Model = { ... }
-- UPDATE
type Msg = Reset | ...
update : Msg -> Model -> Model
update msg model =
case msg of
Reset -> ...
...
-- VIEW
view : Model -> Html Msg
view model =
...
Counter Example
JavaScript Interop
JavaScript Interop
> elm make src/Main.elm
> elm make src/Main.elm --output=main.js
JavaScript Interop
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Main</title>
<script src="main.js"></script>
</head>
<body>
<div id="elm"></div>
<script>
var app = Elm.Main.init({
node: document.getElementById('elm')
});
</script>
</body>
</html>
JavaScript Interop
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Main</title>
<script src="main.js"></script>
</head>
<body>
<div id="elm"></div>
<script>
var app = Elm.Main.init({
node: document.getElementById('elm')
});
</script>
</body>
</html>
Flags
var app = Elm.Main.init({
node: document.getElementById('elm')
});
var app = Elm.Main.init({
node: document.getElementById('elm'),
flags: Date.now()
});
Ports
Drawbacks
New Language
Small Package Ecosystem
Hiring
Lots of code
Future of Elm
Future of Elm
Future of Elm
Future of Elm
Web Assembly
Additional Info
Resources
- elm-lang.org
- guide.elm-lang.org
- Slack
- elmlang.herokuapp.com
- elm-tutorial
-
Elm In Action
- by Richard Feldman
-
Programming Elm
- by Jeremy Fairbanks

By Jim.henderson - Own work, CC0, https://commons.wikimedia.org/w/index.php?curid=15909555
Questions?
Thank you!
Elm Programming Language
By Andrew Schutt
Elm Programming Language
a presentation for Iowa Code Camp as an introduction to the Elm Programming Language
- 1,614