I can’t seem to figure out when you would use Html msg over Html Msg. Clarification and a bit of the internals will be appreciated!
The lower case
msg is called a type variable.
The upper case
Msg is called a concrete type - its something your application has defined.
So we might have:
view : Html msg view = div  
type Msg = Click view : Html Msg view = div [ onClick Click ] 
The first one doesn’t produce any events, so its type variable is not bound to anything yet.
The second one produces events of your
Msg type, and its type variable is bound to that.
Also note that this compiles ok:
innerView : Html msg innerView = div   view : Html Msg view = div [ onClick Click ] [ innerView ]
innerView needs to have the type
Html Msg to be included in some HTML with that type. That’s ok because the free
msg variable can be bound to
Msg and the type checking passes.
Yes! I finally understand it better now. Thank you for your time!
I think part of the confusion here is that there are two different things referred to as “message” in the Elm community.
- The generic idea of a value that represents an event in the outside world and that will eventually feed into your update function. It shows up as a type variable in several types where it is conventionally written as little “m”
- A user-defined custom type named big “M”
While there’s often a lot of overlap between the two, they are not the same.
Msg isn’t a “magic” framework type and types like
Html String or
Html Int are valid. More subtly, larger projects such as elm-spa-example often have view functions that return values like
Html Home.Msg or
While the lowercase
msg variable name has good intentions of communicating “the type that would go here fills the role of a message (definition 1)”, my experience is that many people read it as “the type that would go here is going to be a
Msg (definition 2)”.
Personally, I’ve started using
Html a in my own code rather than
Html msg to avoid this confusion
Thank you for your thorough response!
This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.