Анализирует ли Dialyzer анонимные функции?

В своем прогрессе в изучении эликсира, я играю с 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 не может проверить ошибки такого рода или я что-то не так делаю.

1 ответ

Решение

Кажется, это ошибка диализатора. призвание :lists.all/2 (с заменой аргументов) выдает правильное предупреждение, но по какой-то причине вызывает ваш локальный all?/2 Функция с той же спецификацией не имеет.

Другие вопросы по тегам