Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to Find the Bar

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

How to Find the Bar

The Maybe Monad in Elm

Lightning talk for SocratesBe
http://verraes.net

Avatar for Mathias Verraes

Mathias Verraes

August 17, 2016

More Decks by Mathias Verraes

Other Decks in Programming

Transcript

  1. 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"
  2. 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" ) ] )
  3. 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
  4. ==================================== 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.
  5. 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
  6. find : Int -> Maybe Msg find n = case

    findC n of Nothing -> Nothing Just c -> case findS c of Nothing -> Nothing Just s -> findM s
  7. 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
  8. 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"
  9. you understand monads now (>>=) :: m a -> (a

    -> m b) -> m b m can be many many things