6

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.

4

1 回答 1

2

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

于 2015-07-09T11:19:30.973 回答