I’m learning Elixir and, a little unwillingly, learning about it’s system of type specifications. I will concede that being able to specify the types of return values is helpful but I am not sure about the rest. Nevertheless I am told the Dialyzer system (that analyses type information and looks for errors) can be very helpful so for now I am playing along.
While reading the documentation something caught my eye:
Defining custom types can help communicate the intention of your code and increase its readability.
defmodule Person do
@typedoc """
A 4 digit year, e.g. 1984
"""
@type year :: integer
@spec current_age(year) :: integer
def current_age(year_of_birth), do: # implementation
end
I found myself puzzled by this statement. The argument in question year_of_birth
is already clearly indicating it’s a year. And the type cannot enforce the rule “A 4 digit year, e.g. 1984”.
So what is the type spec adding? It seems to me that what it’s adding is a step of cognitive overhead in understanding that what is being passed is an integer
.
I’ve seen other examples of creating types for username
and password
that alias the String.t
type and again I find this unconvincing since the function being spec’d almost certainly calls it’s arguments username
and password
so what is being added?
Where a type adds useful information I buy it. A struct
for example is already a kind of alias since it defines compound structure. But for primitive types like String.t
and integer
it seems like adding aliases is hiding information not adding to it.