Dialyzer是否会分析匿名函数?

Mic*_*ahl 6 elixir dialyzer

在我学习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
Run Code Online (Sandbox Code Playgroud)

Dialyzer似乎没有报告此代码的任何错误或警告,如果Dialyzer无法检查这种错误或者我做错了什么,我很好奇.

Eri*_*son 2

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