6

Elixir を学習する過程で、関数に型を付けるために Dialyzer をいじっています。この点に関して、Dialyzer が無名関数の型をチェックしていないように見えることに気付きました。

以下の例では、2 つの数値を加算して数値を返す無名関数を関数に渡して(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 がこの種の間違いをチェックできないか、または私が何か間違ったことをしている場合、私は興味があります。

4

1 に答える 1

2

ダイアライザーのバグのようです。(引数を交換して)呼び出す:lists.all/2と正しい警告が生成されますが、何らかの理由all?/2で同じ仕様でローカル関数を呼び出すと生成されません。

于 2015-07-09T11:19:30.973 に答える