What does it mean by
Html Msg?
There are possibly 2 questions in this question. I'll answer them 1 by 1
After knowing the basic Elm syntax, we could be reading the following "return values" like this
userFromJWT : String -> Maybe User
-- returns a User value or nothingsplit : String -> List String
-- returns a list of StringWith the help from our prior programming experience, we treat the return values as *User and []String and jumps directly to think in terms of "How do I use a var u *User value? u.name?" and "How do I use a var s String? String.length(s)?"
We don't actually "see" the words Maybe or List; our attention was focused on User and String.
If we proceed with these instincts alone, we'll fumble when we see unfamiliar types. We'd ask the wrong questions
view : Model -> Html Msg
-- returns an h-t-m-l message... but how do I return such a message?userEmail : Json.Decode.Decoder String
-- returns a json decode decoder string... but how do I return such a string?There are no answers to the questions because there's a misunderstanding of the grammar. To avoid being misled by my prior programming experience, I do this one weird trick instead:
-
Just focus on the first word
Html Msg ^^^^ -- and read "Html" type Json.Decode.Decoder String ^^^^^^^^^^^^^^^^^^^ -- and read "Json.Decode.Decoder" type HelloWorld (Html msg) (Json.Decode.Decoder String) ^^^^^^^^^^ -- and read "HelloWorld" type
-
Then look at the documentation for that word; look for functions that returns that word
Here are some functions that I found with text search -> Html on in the Html docs page
text : String -> Html msg
div : List (Attribute msg) -> List (Html msg) -> Html msg
span : List (Attribute msg) -> List (Html msg) -> Html msg
-- note: unfamiliar types like `Attribute` usually refers to a type defined in the same module, i.e. `Html.Attribute`. You may have to search around for itAnd calling any of the these functions will be able to give us a value of Html type, just provide the necessary input argument values.
Here are some functions that I found returning Decoder in the docs page of Json.Decode (there wasn't a page on Json.Decode.Decoder alone)
string : Decoder String
int : Decoder Int
list : Decoder a -> Decoder (List a)
field : String -> Decoder a -> Decoder a
oneOf : List (Decoder a) -> Decoder aSame idea: calling any of the these functions will be able to give us a value of Json.Decode.Decoder type, just provide the necessary input argument values.
In an Elm Browser program we are required to provide a view function that returns Html type. We can deduce Elm takes this return value and renders the corresponding DOM nodes in the browser.
view : model -> Html msg
view model =
Html.h1 [ Html.Attributes.class "greeting" ] [ Html.text "Hello" ]will render
<h1 class="greeting">Hello</h1>The Html module does not export the internal details of this type for us to look at (aka it's an opaque type). The module only exports a bunch of functions for us to call, to obtain various Html values. And really that's all we can know about it.