在我学习Elixir的过程中,我正在和Dialyzer一起玩我的功能。在这方面,我注意到Dialyzer似乎没有检查匿名函数的类型。
在下面的示例中,我传递的是一个匿名函数,它将两个数字相加并返回一个数字(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无法检查此类错误或我做错了什么,我很好奇。
答案 0 :(得分:2)
这似乎是一个透析器的错误。调用:lists.all/2
(交换参数)会产生正确的警告但由于某种原因,调用具有相同规范的本地all?/2
函数则不会。