P
Size: a a a
P
Е
@spec foo(a, b) :: c
@spec foo(b, a) :: c
Вот такое не очень хорошо:@spec foo(a | b, a | b) :: c
так как разрешает вызов с двумя параметрами одного типа.Е
LL
Е
B
HR
defmodule Demo do
@spec foo(integer(), float()) :: float()
@spec foo(float(), integer()) :: float()
def foo(a, b) when is_integer(a) and is_float(b) do
do_foo_if(a, b)
end
def foo(a, b) when is_float(a) and is_integer(b) do
do_foo_fi(a, b)
end
@spec do_foo_if(integer(), float()) :: float()
defp do_foo_if(a, b) do
a + b
end
@spec do_foo_fi(float(), integer()) :: float()
defp do_foo_fi(a, b) do
a + b
end
end
overlaping domains
.HR
Е
HR
<...>
def bar() do
foo(2.0, 2.0)
end
<...>
The contract 'Elixir.Demo':foo(integer(),float()) -> float()
; (float(),integer()) -> float() cannot be right because the inferred return for foo(2.0,2.0) on line 4 is float()
HR
def bar() do
foo(2.0, 2)
end
HR
LL
XY
, потому что я с таким вообще никогда не сталкивался. В чём корень проблемы?Е
LL
Е
LL
Е
MapSet.difference()
, а вызов моей функции с такими аргументами говорит, что что-то явно попутано.Е
Е