7

私は elixir_talk ライブラリを使用しています。接続後、beanstalkd に接続したらプライベート関数を呼び出したいと思います。typespec を追加して、Dialyzer を実行しました (dialyxir 経由)。エラーが発生します:

my_module.ex:3: The specification for 'Elixir.MyModule':f/0 states that the function might also return 'ok' | {'error',_} but the inferred return is none()
my_module.ex:4: Function f/0 has no local return
my_module.ex:14: Function g/1 will never be called

これを生成する私が見つけることができる最小限の例は

defmodule MyModule do
  @spec f() :: :ok | {:error, term}
  def f() do
    case ElixirTalk.connect('127.0.0.1', 11300) do
      {:ok, conn} ->
        g(conn)
      {:error, err} ->
        {:error, err}
    end
  end

  @spec g(pid) :: :ok
  defp g(pid) do
    :ok
  end
end

ElixirTalk.connectへの呼び出しを代わりにへの呼び出しに置き換えるとspawn、Dialyzer は問題を報告しなくなります。

defmodule MyModule do
  @spec f() :: :ok
  def f() do
    x = spawn fn -> :done end
    g(x)
  end

  @spec g(pid) :: :ok
  defp g(pid) do
    :ok
  end
end

ここでDialyzerが混乱している理由を誰か知っていますか?

4

1 に答える 1