Elm defines the following special type variables that have a particular meaning to the compiler:
comparable
: Comprised of Int
, Float
, Char
, String
and tuples thereof. This allows the use of the <
and >
operators.
Example: You could define a function to find the smallest and largest elements in a list (extent
). You think what type signature to write. On one hand, you could write extentInt : List Int -> Maybe (Int, Int)
and extentChar : List Char -> Maybe (Char, Char)
and another for Float
and String
. The implementation of these would be the same:
extentInt list =
let
helper x (minimum, maximum) =
((min minimum x), (max maximum x))
in
case list of
[] ->
Nothing
x :: xs ->
Just <| List.foldr helper (x, x) xs
You might be tempted to simply write extent : List a -> Maybe (a, a)
, but the compiler will not let you do this, because the functions min
and max
are not defined for these types (NB: these are just simple wrappers around the <
operator mentioned above). You can solve this by defining extent : List comparable -> Maybe (comparable, comparable)
. This allows your solution to be polymorphic, which just means that it will work for more than one type.
number
: Comprised of Int
and Float
. Allows the use of arithmetic operators except division. You can then define for example sum : List number -> number
and have it work for both ints and floats.
appendable
: Comprised of String
, List
. Allows the use of the ++
operator.
compappend
: This sometimes appears, but is an implementation detail of the compiler. Currently this can't be used in your own programs, but is sometimes mentioned.
Note that in a type annotation like this: number -> number -> number
these all refer to the same type, so passing in Int -> Float -> Int
would be a type error. You can solve this by adding a suffix to the type variable name: number -> number' -> number''
would then compile fine.
There is no official name for these, they are sometimes called:
This is because they work like Haskell's Type Classes, but without the ability for the user to define these.