Return type of map

I’m looking at an existing project with code like this:

  @spec default_rating :: List.t()
  @spec default_rating(non_neg_integer()) :: List.t()
  def default_rating(rating_type_id \\ nil) do
    {skill, uncertainty} = Openskill.rating()
    rating_value = calculate_rating_value(skill, uncertainty)
    leaderboard_rating = calculate_leaderboard_rating(skill, uncertainty)

    %{
      rating_type_id: rating_type_id,
      skill: skill,
      uncertainty: uncertainty,
      rating_value: rating_value,
      leaderboard_rating: leaderboard_rating
    }
  end

I don’t understand why the return type is List.t().
Can I use :: map as the return type? What’s the difference?

There is no such type in standard library, so the spec is invalid.
Is there a declared alias which replaces List?

The return type should be map.

Does this project use Dialyzer?

That code is from an open source library:
teiserver/lib/teiserver/battle/libs/balance_lib.ex at master · beyond-all-reason/teiserver · GitHub

Line 421. I don’t see a declared alias that replaces List.

I don’t see a declaration of the sort @type List ... in the project so this is definitely a mistake on the authors’ part.

1 Like

Typespecs are not checked by compiling the code, but only by external type checkers like dialyzer and others. Therefore in a context where such checkers are not (regularly) used it‘s easy for mistakes in typespecs not to be caught.

1 Like

Yes, the code always right! :wink:

1 Like

I’m the person that wrote this. As per the other comments yes this is 100% a mistake (mine) and probably because I copied and pasted something wrong or completely misunderstood something at the time. As you can see I then changed the function and never updated the type spec which isn’t great of me.

2 Likes