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
I’ve seen other examples of creating types for
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
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
integer it seems like adding aliases is hiding information not adding to it.