以下は Elixir 1.3 での最小限の壊れた例です:
defmodule Foo do
@type t :: %__MODULE__{x: non_neg_integer}
defstruct x: 0
@spec test(t) :: t
def test(%__MODULE__{} = foo), do: test2(foo)
@spec test2(t) :: t
defp test2(%__MODULE__{} = foo), do: %__MODULE__{foo | x: 5}
end
これは、タイプ チェックに失敗します: foo.ex:9: The variable _@1 can never match since previous clauses completely covered the type #{'__struct__':='Elixir.Foo', _=>_}
。
私は検索して検索しましたが、これが何を意味するのか、またはそれを修正する方法の説明を見つけることができません。