Elixir を学習する過程で、関数に型を付けるために Dialyzer をいじっています。この点に関して、Dialyzer が無名関数の型をチェックしていないように見えることに気付きました。
以下の例では、2 つの数値を加算して数値を返す無名関数を関数に渡して(t::number -> number)
いall?
ます。all?
したがって、仕様で約束されているようにブール値を返しません(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 は、このコードに対してエラーや警告を報告していないようです。Dialyzer がこの種の間違いをチェックできないか、または私が何か間違ったことをしている場合、私は興味があります。