I am using the elixir_talk library. After connecting I want to call a private function once connected to beanstalkd. I just added typespecs and ran Dialyzer (via dialyxir). I get the errors:
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
The minimal example I could find that produces this is
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
If I replace the call to ElixirTalk.connect with a call to spawn instead, Dialyzer no longer reports any problems.
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
Does anyone know why Dialyzer is getting confused here?