Как оборотень говорит в другой ответ , -spec
используется только для анализа, а не как часть подписи.Если вы хотите проверить типы ввода, вы можете включить проверки для типа в охране.Итак, в вашем примере вы можете сделать:
fib(N) when is_integer(N), N > 0, N < 3 ->
1;
fib(N) when is_integer(N), N >= 3 ->
fib(N-1) + fib(N-2).
Или, более идиоматически, поскольку есть только два законных базовых случая:
fib(1) -> 1;
fib(2) -> 1;
fib(N) when is_integer(N), N >= 3 ->
fib(N-1) + fib(N-2).
Это помешает вам сделать что-то вродеfib(bogus)
или fib(0.5)
или даже fib(-1)
.Если вы попытаетесь это сделать, произойдет сбой с badmatch
во время выполнения.
Примечание: единственными функциями, которые вы можете использовать в guard , являются встроенные функции, разрешенные средой выполнения.Большинство из них находятся в модуле erlang
.