Elm has managed effects, meaning that things like HTTP requests or writing to disk are all treated as data in Elm. When this data is given to the Elm runtime system, it can do some “query optimization” before actually performing the effect. Perhaps unexpectedly, this managed effects idea is the heart of why Elm is so nice for testing, reuse, reproducibility, etc.

There are two kinds of managed effects you will use in your programs: commands and subscriptions.

type Cmd msg
A command is a way of telling Elm, “Hey, I want you to do this thing!” So if you want to send an HTTP request, you would need to command Elm to do it.

Every Cmd specifies (1) which effects you need access to and (2) the type of messages that will come back into your application.

map : (a -> msg) -> Cmd a -> Cmd msg
batch : List (Cmd msg) -> Cmd msg
none : Cmd msg
(!) : model -> List (Cmd msg) -> (model, Cmd msg)