вот такие два варианта вызова функции?
@spec foo(a, b) :: c
@spec foo(b, a) :: c
Вот такое не очень хорошо:
@spec foo(a | b, a | b) :: c
так как разрешает вызов с двумя параметрами одного типа.
Такой возможности нет
Печаль.
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.
Я бы подумал о том зачем это нужно, очень похоже на XY, потому что я с таким вообще никогда не сталкивался. В чём корень проблемы?
Да нет особой проблемы на самом деле. Просто дал функциям разные имена и все.
Во, это уже круто. Просто меня смущает, что это очевидно какой-то оператор из серии умножения вектора на число, который приводится к умножению вектора на вектор
Это операция вычитания над множествами хранящимися в ets и в MapSet.
А почему тогда нельзя из мапсета вычитать мапсет, например?
Для этого есть MapSet.difference(), а вызов моей функции с такими аргументами говорит, что что-то явно попутано.
Обсуждают сегодня