functional web development using elm

101
Functional Web Programming using Elm Spencer Schneidenbach @schneidenbach schneids.net

Upload: spencer-schneidenbach

Post on 16-Apr-2017

303 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Functional Web Development using Elm

Functional Web Programming using Elm

Spencer Schneidenbach @schneidenbach

schneids.net

Page 2: Functional Web Development using Elm
Page 3: Functional Web Development using Elm
Page 4: Functional Web Development using Elm
Page 5: Functional Web Development using Elm
Page 6: Functional Web Development using Elm
Page 7: Functional Web Development using Elm
Page 8: Functional Web Development using Elm

Common element?

Page 9: Functional Web Development using Elm

JavaScript

Page 10: Functional Web Development using Elm

this

Page 11: Functional Web Development using Elm

https://www.christosmonogios.com/2016/08/15/The-

This-Keyword-In-JavaScript-Must-Know-JavaScript-Features-Every-Programmer-Should-Learn-To-

Master-The-Language/

http://odetocode.com/blogs/scott/archive/

2016/09/01/the-troubles-with-

javascript-arrow-functions.aspx

https://derickbailey.com/

2016/08/22/undefined-is-not-

a-function/

http://www.bitnative.co

m/2016/08/18/react-binding-patterns-this-

keyword/

http://www.javascripthive.info/javascript/context-this/

Page 12: Functional Web Development using Elm

var customer = repo.getCustomer(id); var orders = customer.getOrders();

Page 13: Functional Web Development using Elm

var customer = repo.getCustomer(id); var orders = customer.getHorDoeuvres();

Page 14: Functional Web Development using Elm

var customer = repo.getCustomer(id); var orders = customer.getOrderes();

Page 15: Functional Web Development using Elm
Page 16: Functional Web Development using Elm

JavaScript Isn’t Bad.

Page 17: Functional Web Development using Elm

JavaScript Is Weird.

Page 18: Functional Web Development using Elm
Page 19: Functional Web Development using Elm

Elm “just works.”

Page 20: Functional Web Development using Elm

Not like a Mac “just works”

Page 21: Functional Web Development using Elm

That’s pretty vague

Page 22: Functional Web Development using Elm

So let’s dig in

Page 23: Functional Web Development using Elm

Four things

Page 24: Functional Web Development using Elm

One: handling null

Page 25: Functional Web Development using Elm

null

Page 26: Functional Web Development using Elm

–Tony Hoare

“I call it my billion-dollar mistake. It was the invention of the null reference in 1965.”

Page 27: Functional Web Development using Elm

null/undefined

Page 28: Functional Web Development using Elm

What about in Elm?

Page 29: Functional Web Development using Elm

type alias Order = { name: String, date: Date, amount: Float }

Page 30: Functional Web Development using Elm

type alias Order = { name: String, date: Date, amount: Float }

myOrder: Order

Page 31: Functional Web Development using Elm
Page 32: Functional Web Development using Elm

myOrder : Order myOrder = { --no name date = today, amount = 123.45 }

Page 33: Functional Web Development using Elm
Page 34: Functional Web Development using Elm

myOrder : Order myOrder = { name = null, date = today, amount = 123.45 }

Page 35: Functional Web Development using Elm
Page 36: Functional Web Development using Elm

So where is null?

Page 37: Functional Web Development using Elm

Easy: there IS no null

Page 38: Functional Web Development using Elm

Easy: there IS no null

(loud applause and cheering)

Page 39: Functional Web Development using Elm

type Maybe a = Just a | Nothing

Page 40: Functional Web Development using Elm

getAmount : Maybe Int -> String getAmount maybeInt = case maybeInt of Just i -> "You have: " ++ toString i Nothing -> "You don't have any!"

Page 41: Functional Web Development using Elm

type Maybe a = Just a | Nothing

Page 42: Functional Web Development using Elm

type ContactType = Email String | Phone Int | Twitter String | Address MailingAddress

Page 43: Functional Web Development using Elm

type ContactType = Email String | Phone Int | Twitter String | Address MailingAddress

contactPerson : ContactType -> String contactPerson contact = case contact of Email email -> email Phone phoneNumber -> "Phone: " ++ toString phoneNumber Twitter twitterHandle -> "Twitter: " ++ twitterHandle

Page 44: Functional Web Development using Elm
Page 45: Functional Web Development using Elm

type ContactType = Email String | Phone Int | Twitter String | Address MailingAddress

contactPerson : ContactType -> String contactPerson contact = case contact of Email email -> email Phone phoneNumber -> "Phone: " ++ toString phoneNumber Twitter twitterHandle -> "Twitter: " ++ twitterHandle Address myAddress -> "No one sends mail anymore"

Page 46: Functional Web Development using Elm

No void

Page 47: Functional Web Development using Elm

Two: immutability

Page 48: Functional Web Development using Elm

Let’s set the stage

Page 49: Functional Web Development using Elm
Page 50: Functional Web Development using Elm

Feature request:Order amounts that are negative

should have a red name

Page 51: Functional Web Development using Elm
Page 52: Functional Web Development using Elm

Feature request:Salespeople who are not active

should not be displayed

Page 53: Functional Web Development using Elm
Page 54: Functional Web Development using Elm
Page 55: Functional Web Development using Elm
Page 56: Functional Web Development using Elm
Page 57: Functional Web Development using Elm
Page 58: Functional Web Development using Elm

What about Elm?

Page 59: Functional Web Development using Elm

No mutation. Can’t modify existing

objects.

Page 60: Functional Web Development using Elm

Instead, you create copies

Page 61: Functional Web Development using Elm

myOrder : Order myOrder = { name = "Lumber", contact = Email "[email protected]", amount = 123.45 }

Page 62: Functional Web Development using Elm

myOrder : Order myOrder = { name = "Lumber", contact = Email "[email protected]", amount = 123.45 }

myOrder.contact = Phone 5551234

Page 63: Functional Web Development using Elm
Page 64: Functional Web Development using Elm

myOrder : Order myOrder = { name = "Lumber", contact = Email "[email protected]", amount = 123.45 }

myOrder = { name = "Lumber", contact = Phone 5551234, amount = 123.45 }

Page 65: Functional Web Development using Elm
Page 66: Functional Web Development using Elm

myOrder : Order myOrder = { name = "Lumber", contact = Email "[email protected]", amount = 123.45 }

myNewOrder : Order myNewOrder = { myOrder | contact = Phone 5551234 }

Page 67: Functional Web Development using Elm

Three: error handling

Page 68: Functional Web Development using Elm
Page 70: Functional Web Development using Elm

Guess what?

Page 71: Functional Web Development using Elm

There are

NO RUNTIME ERRORS in Elm

Page 72: Functional Web Development using Elm
Page 73: Functional Web Development using Elm

type Maybe a = Just a | Nothing

Page 74: Functional Web Development using Elm
Page 75: Functional Web Development using Elm

function getInputCount() { var input = $(".count").val(); return parseInt(input); }

Page 76: Functional Web Development using Elm

function getInputCount() { var input = $(".count").val(); //bgggs return parseInt(input); //NaN }

Page 77: Functional Web Development using Elm

type Result error value = Err error | Ok value

Page 78: Functional Web Development using Elm

String.toInt : String -> Result String Int

Page 79: Functional Web Development using Elm

multiplyStrings : String -> String -> Maybe Int multiplyStrings str1 str2 = let intStringOne = String.toInt str1 intStringTwo = String.toInt str2 in case (intStringOne, intStringTwo) of (Ok int, Ok int2) -> Just (int * int2) (_, _) -> Nothing

Page 80: Functional Web Development using Elm

No try/catch blocks

Page 82: Functional Web Development using Elm

Elm makes you handle errors.

Page 83: Functional Web Development using Elm

Four: The Elm Architecture

Page 84: Functional Web Development using Elm
Page 85: Functional Web Development using Elm

function counter(state = 0, action) { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 default: return state } }

Page 86: Functional Web Development using Elm

function counter(state = 0, action) { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 default: return state } }

let store = createStore(counter)

store.dispatch({ type: 'INCREMENT' })

Page 87: Functional Web Development using Elm

function employeeStore(state = [], action) { switch (action.type) { case 'ADD': return [...state, action.employee] default: return state } }

let store = createStore(employeeStore)

store.dispatch({ type: 'ADD', employee: { firstName: 'Spencer' } })

Page 88: Functional Web Development using Elm

function employeeStore(state = [], action) { switch (action.type) { case 'ADD': state.push(action.employee); return state; default: return state } }

let store = createStore(employeeStore)

store.dispatch({ type: 'ADD', employee: { firstName: 'Spencer' } })

Page 89: Functional Web Development using Elm

function employeeStore(state = [], action) { switch (action.type) { case 'ADD': return state.push(action.employee); default: return state } }

let store = createStore(employeeStore)

store.dispatch({ type: 'ADD', employee: { firstName: 'Spencer' } })

Page 90: Functional Web Development using Elm

Array.push -> number

Page 91: Functional Web Development using Elm
Page 92: Functional Web Development using Elm

Model Update

View

Page 93: Functional Web Development using Elm

-- MODEL

type alias Model = Int

model : Model model = 0

Page 94: Functional Web Development using Elm

-- UPDATE

type Msg = Increment | Decrement

update : Msg -> Model -> Model update msg model = case msg of Increment -> model + 1

Decrement -> model - 1

Page 95: Functional Web Development using Elm

-- UPDATE

type Msg = Increment | Decrement

update : Msg -> Model -> Model update msg model = case msg of Increment -> model + 1

Page 96: Functional Web Development using Elm
Page 97: Functional Web Development using Elm

-- UPDATE

type Msg = Increment | Decrement

update : Msg -> Model -> Model update msg model = case msg of Increment -> model + 1

Decrement -> model - 1

Page 98: Functional Web Development using Elm

-- VIEW

view : Model -> Html Msg view model = div [] [ button [ onClick Decrement ] [ text "-" ] , div [] [ text (toString model) ] , button [ onClick Increment ] [ text "+" ] ]

Page 99: Functional Web Development using Elm

1. null handling 2. immutability 3. error handling 4. The Elm Architecture

Page 100: Functional Web Development using Elm
Page 101: Functional Web Development using Elm

Thank you!

@schneidenbach schneids.net