Namespaces
We have just specified the return type of the view
function to be
Html.Html ()
. Why are there two mentions of Html
? We will answer that
question in this chapter.
Look at the top of the file. There is an import line.
import Html
This imports the Html
module from the Htmll
package. As can be
seen from the documentation, this package provides a lot of useful functions.
In order to use these functions you have to use there fully qualified name. E.g.
if you want to use the function div
that will render a div element on the
page. You write
Html.div
The reason for using the fully qualified name is to avoid name clashes. Let's illustrate a name clash with an example.
Favorite number
We are going to ask somebody to create a module providing us with their
favorite number. Kirsty told us that her favorite number is 42
. Daan favorite
on the other hand is 37. We could create modules that record these favorites.
We will settle on the name number
to record the respective favorite number. If
we wanted to use both numbers in one program, we would not have a problem. We
can use fully qualify the name and we would still know which number we mean.
If we wanted to use Kirsty's number we would write Kirsty.number
and get 42.
If instead we wanted to use Daan's number, we would wirte Daan.number
.
Second Html
We learned about the first Html
in the signature of the view
function. It is
the Html namespace. A namespace will prevent name clashes between different
modules. But what about the second Html
.
If you take a look at the Html
documentation you will find it
exposes a type alias Html
. The Html
type can be used to annotate
functions like our view
function that it is returning Html.
Exposing names
Sometimes there is no danger of name clashes. E.g. it will be unlikely that we
will using two Html
types. In order to shorten the Html.Html
part to just
the type Html
we can expose the Html
type into our own namespace.
We can expose names from modules when we import them. In order to expose the
Html
type from the Html
module we would write
import Html exposing (Html)
This allows us to write the signature of the view function ascii
view : String -> Html ()
If you find it tedious to have to fully qualify the div
and span
functions
from the Html
module. the import line would read
import Html exposing (Html, div, span)
Verification
In this chapter you learned about namespaces, fully qualified names and exposing names in your own namespace. In order to verify if you have grasped these concept, try to answer the following question.
Why can't we expose the text
function from the Html
module?