Slide 1

Slide 1 text

how to find the bar @mathiasverraes

Slide 2

Slide 2 text

disclaimer i don't actually know elm

Slide 3

Slide 3 text

joining some lookup tables Integer to Character 1 => 'a' 2 => 'b' 3 => 'c' Character to String 'a' => "foo" 'b' => "bar" String to Msg "foo" => "No bar here" "bar" => "You found the bar"

Slide 4

Slide 4 text

import Dict exposing (get, fromList) findC n = get n (fromList [ ( 1, 'a' ), ( 2, 'b' ), (3, 'c') ]) findS c = get c (fromList [ ( 'a', "foo" ), ( 'b', "bar" ) ]) findM s = get s (fromList [ ( "foo", "No bar here" ) , ( "bar", "You found the bar" ) ] )

Slide 5

Slide 5 text

regular programming find n = findM (findS (findC n)) mediocre functional style find n = findC n |> findS |> findM composing computations like a boss find = findC >> findS >> findM

Slide 6

Slide 6 text

==================================== ERRORS ==================================== -- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm The right argument of (|>) is causing a type mismatch. 5| findC 2 |> findS ^^^^^ (|>) is expecting the right argument to be a: Maybe Char -> a But the right argument is: Char -> Maybe String Hint: I always figure out the type of the left argument first and if it is acceptable on its own, I assume it is "correct" in subsequent checks. So the problem may actually be in how the left and right arguments interact.

Slide 7

Slide 7 text

Y YOU NO COMPOSE?! > findC 1 Just 'a' : Maybe.Maybe Char > findC 5 Nothing : Maybe.Maybe Char lookups have 0 or 1 results! findC : Int -> Maybe Char findS : Char -> Maybe String findM : String -> Maybe Msg

Slide 8

Slide 8 text

find : Int -> Maybe Msg find n = case findC n of Nothing -> Nothing Just c -> case findS c of Nothing -> Nothing Just s -> findM s

Slide 9

Slide 9 text

andThen : Maybe a -> (a -> Maybe b) -> Maybe b andThen x f = case x of Nothing -> Nothing Just a -> f a find n = findC n `andThen` findS `andThen` findM > find 1 Nothing : Maybe.Maybe Msg > find 2 Just "You found the bar" : Maybe.Maybe Msg

Slide 10

Slide 10 text

elm: generalised andThen for all computations that can return nothing or fail haskell: generalised for even more contexts (>>=) :: m a -> (a -> m b) -> m b aka "bind"

Slide 11

Slide 11 text

you understand monads now (>>=) :: m a -> (a -> m b) -> m b m can be many many things

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

thanks ❤ @mathiasverraes verraes.net