在学习Elixir的过程中,我正在与Dialyzer一起玩,在函数中添加类型。在这方面,我注意到Dialyzer似乎没有检查匿名函数的类型。

在下面的示例中,我将传递一个匿名函数,该函数将两个数字相加并返回一个数字(t::number -> number)all?函数中。因此,我没有像all? spec (t::any -> boolean)中所 promise 的那样返回 bool 值。

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无法检查此类错误或我做错了什么,我会感到好奇。

最佳答案

这似乎是Dialyzer的错误。调用:lists.all/2(交换了参数)会产生正确的警告,但由于某种原因,以相同的规范调用本地all?/2函数不会。

10-08 02:40