Slide 1

Slide 1 text

ROLLING RANDOM ROMANS

Slide 2

Slide 2 text

TAKE A JOURNEY

Slide 3

Slide 3 text

REPUBLICAN ROME

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

YOU

Slide 7

Slide 7 text

JUNO

Slide 8

Slide 8 text

YOUR MISSION

Slide 9

Slide 9 text

ROMAN NAMING SYSTEM

Slide 10

Slide 10 text

MEN

Slide 11

Slide 11 text

PRAENOMEN Publius Cornelius Scipio Africanus

Slide 12

Slide 12 text

NOMEN Publius Cornelius Scipio Africanus

Slide 13

Slide 13 text

COGNOMEN Publius Cornelius Scipio Africanus

Slide 14

Slide 14 text

AGNOMEN Publius Cornelius Scipio Africanus

Slide 15

Slide 15 text

WOMEN

Slide 16

Slide 16 text

NOMEN Cornelia Africana Minor

Slide 17

Slide 17 text

COGNOMEN Cornelia Africana Minor

Slide 18

Slide 18 text

DIFFERENTIATOR Cornelia Africana Minor

Slide 19

Slide 19 text

OUR PROGRAM

Slide 20

Slide 20 text

MODEL type alias Id = Integer type alias Model = { romans : Dict Id Roman , nextId : Id }

Slide 21

Slide 21 text

ROMAN type alias Roman = { id : Id , clan : Clan , children : Children , name : Name } type Children = Children (List Roman)

Slide 22

Slide 22 text

NAME type Name = FemaleName (Maybe String) (Maybe String) | MaleName String (Maybe String) (Maybe String) type alias Clan = { name : String , color : String }

Slide 23

Slide 23 text

VIEW viewRoman : Roman -> Html Msg viewRoman roman = li [ style [ ( "color", roman.clan.color ) ] ] [ text (formattedName roman) , button [ onClick (GenerateChildFor roman) ] [ text "Bless with child" ] , viewChildren roman.children ]

Slide 24

Slide 24 text

UPDATE type Msg = GenerateChildFor Roman | Birth Roman Roman update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of GenerateChildFor father -> ( model, Random.generate (Birth father) Random.Roman.roman ) Birth father child -> -- append child to father ( { model | romans = updatedRomans }, Cmd.none )

Slide 25

Slide 25 text

RANDOMNESS IN A FUNCTIONAL WORLD

Slide 26

Slide 26 text

PURE FUNCTIONS > 2 + 2 = 4 > floor 5.6 = 5 > toUpper "abc" = "ABC"

Slide 27

Slide 27 text

RANDOM IS INHERENTLY NOT PURE rand(1000) # => 964 rand(1000) # => 592 rand(1000) # => 482 rand(1000) # => 872 rand(1000) # => 815

Slide 28

Slide 28 text

RANDOM AS A PURE FUNCTION def seeded_rand(seed, max) srand(seed) rand(max) end seeded_rand(123, 1000) # => 510 seeded_rand(123, 1000) # => 510 seeded_rand(123, 1000) # => 510 seeded_rand(123, 1000) # => 510 seeded_rand(123, 1000) # => 510

Slide 29

Slide 29 text

PSEUDO-RANDOM

Slide 30

Slide 30 text

RANDOM IN ELM

Slide 31

Slide 31 text

EXPLICIT SEED randomBool : (Bool, Random.Seed) randomBool = Random.step (Random.initialSeed 123) (Random.bool)

Slide 32

Slide 32 text

COMMANDS type Msg = RequestRandom | Generated Bool update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of RequestRandom -> (model, Random.generate Generated Random.bool) Generated bool -> ({ model | flag = bool }, Cmd.none)

Slide 33

Slide 33 text

COMPLEX VALUES roman : Random.Generator Roman roman = -- generator for romans with random -- * praenomen -- * cognomen -- * agnomen -- * differentiator -- * gender

Slide 34

Slide 34 text

BUILDING GENERATORS

Slide 35

Slide 35 text

WORK FROM THE BOTTOM UP

Slide 36

Slide 36 text

USING EXISTING GENERATOR import Random.Extra differentiator : Random.Generator (Maybe String) differentiator = let differentiators = [ "Maior" , "Minor" , "Prima" , "Tertia" ] in Random.Extra.sample differentiators

Slide 37

Slide 37 text

TRANSFORMING ROLLED VALUES femaleName : Random.Generator Name femaleName = Random.map (FemaleName Nothing) differentiator

Slide 38

Slide 38 text

COMBINING INDEPENDENT ROLLS femaleName : Roman -> Random.Generator Name femaleName father = Random.map2 FemaleName (femaleCognomen father) differentiator

Slide 39

Slide 39 text

CHAIN OF DEPENDENCIES

Slide 40

Slide 40 text

MALE NAME maleName : Random.Generator Name maleName = Random.map3 MaleName praenomen cognomen agnomen

Slide 41

Slide 41 text

AGNOMEN agnomen : Maybe String -> Generator (Maybe String) agnomen cog = case cog of Just _ -> Random.extra.sample ["Felix", "Cuncunctor", "Africanus"] Nothing -> Random.Extra.constant Nothing

Slide 42

Slide 42 text

CHAINING DEPENDENT ROLLS import Random exposing(andThen) maleName : Random.Generator Name maleName = Random.map3 MaleName praenomen cognomen (cognomen `andThen` agnomen)

Slide 43

Slide 43 text

FIXING A BUG import Random exposing(andThen) maleNameFromCognomen : Maybe String -> Generator Name maleNameFromCognomen cog = Random.map3 MaleName praenomen (Random.Extra.constant cog) (agnomen cog) maleName : Generator Name maleName = cognomen `andThen` maleNameFromCognomen

Slide 44

Slide 44 text

RANDOM PLAYBOOK > Existing generators > Transform generators with Random.map > Combine independent generators with Random.map2 and friends > Combine dependent generators with Random.andThen

Slide 45

Slide 45 text

Random.Extra elm-community/random-extra

Slide 46

Slide 46 text

REMAINING STEPS > Rinse > Repeat > Profit $$$

Slide 47

Slide 47 text

EXTRA CREDIT > Some praenomina are favored by a family > Cognomina can be hereditary > weight rolls with percentages

Slide 48

Slide 48 text

DEMO TIME https://joelq.github.io/elm-conf-demo

Slide 49

Slide 49 text

PRINCIPLES > Take advantage of Commands > Make as few calls to Random.generate as possible > Build up complex generators using map, map2, andThen etc > Build from the bottom up

Slide 50

Slide 50 text

ABOUT ME > Twitter: @joelquen > GitHub: @JoelQ > Slides: JoelQ/elm-conf-talk > Demo: JoelQ/elm-conf-demo

Slide 51

Slide 51 text

IMAGES CREDITS > Dice Michael and is distributed under the Creative Commons Attribution 4.0 license. > SPQR See page for author [CC BY 3.0 (http:// creativecommons.org/licenses/by/3.0) or Public domain], via Wikimedia Commons > Republican Elephant By Republican Party (United States)

Slide 52

Slide 52 text

IMAGE CREDITS (CONTINUED) > Elephants at Zama Henri-Paul Motte [Public domain or Public domain], via Wikimedia Commons > Scipio Africanus Giovanni Battista Tiepolo [Public domain or Public domain], via Wikimedia Commons > Cornelia Africana Laurent de La Hyre [Public domain or