elm / elm-lang.org

Server and client code for the Elm website.
http://elm-lang.org/
BSD 3-Clause "New" or "Revised" License
1.99k stars 367 forks source link

Type question on form.html #882

Open agreif opened 1 year ago

agreif commented 1 year ago

on the page 'https://guide.elm-lang.org/architecture/forms.html' is the following type annotation:

viewValidation : Model -> Html msg

should this not be with capital 'M'

viewValidation : Model -> Html Msg

?

Why is 'msg' as type allowed?

thanks

SyntacticalAnomaly commented 1 year ago

Correct me if I'm wrong, but my understanding of this is that lowercase 'msg' is a type variable. It could just as easily be 'a' or 'insertSomeMsgHere' for all intents and purposes. Unless Elm knows what specific type is going to be returned there, it doesn't actually care what that type is.

'Msg' on the other hand is specifically a type that someone has declared in the program. It's the type that gets passed into your update function, and if it doesn't match the message that your Html in your view wants to output, it won't compile.

In this specific example, neither viewInput or viewValidation actually output a 'Msg' which allows us to use a type variable. It might seem like viewInput is returning a 'Msg' at first glance, but it's actually asking for the 'Msg' to be passed in as an argument (toMsg) and as such needs to use a 'msg' (type variable) in its type declaration, just in case a 'Msg' is not the intended output.

If I were to rewrite the Msg definition as this:

type OtherMsg
    = Name String
    | Password String
    | PasswordAgain String

With viewInput defined as it is, only the type annotations for the view and update functions would need to be changed from

view: Model -> Html Msg

update: Msg -> Model -> Model

to

view: Model -> Html OtherMsg

update: OtherMsg -> Model -> Model

I hope that helps!