In my progress of learning Elixir, I am playing around with Dialyzer to put types on my functions. In this regard, I've noticed that Dialyzer doesn't seem to check the types for anonymous functions.
In the example below, I am passing an anonymous function which adds two numbers and returns a number (t::number -> number)
, into the all?
function. Thus I am not returning boolean as promised in the all?
spec (t::any -> boolean)
.
defmodule Exercises do
@spec all?([t::any], (t::any -> boolean)) :: boolean
def all?([], _), do: true
def all?([h|t], con) do
if con.(h) do
all?(t,con)
else
false
end
end
@spec funski() :: boolean
def funski() do
all?([1,1,2], &(&1 + 1))
end
end
Dialyzer doesn't seem to report any errors or warnings for this code, and I am curios if Dialyzer is unable to check this kind of mistakes or if I am doing something wrong.
all?/2
makes Dialyzer yield following warningThe call 'Elixir.Exercises':'all?'(fun((_) -> number()),[1 | 2,...]) will never return since the success typing is (maybe_improper_list(),any()) -> boolean() ...
. But I don't see how that relates to the analysis of the anonymous function&(&1 + 1)
– Crowfoot