Есть ли способ использовать локальную функцию в охране - PullRequest
10 голосов
/ 28 июня 2011

Вот мой код:

is_prime(Num)->
    length(list_of_dividers(Num)) == 0.

problem_7(Current, Primes, Counter) when Primes >= 10001->
    Current;
problem_7(Current, Primes, Counter) when is_prime(Counter) ->
    problem_7(Counter, Primes + 1, Counter + 1);
problem_7(Current, Primes, Counter) ->
    problem_7(Current, Primes, Counter).

Я получаю ошибку:

32> c(problem_7).
./problem_7.erl:30: call to local/imported function is_prime/1 is illegal in guard

И я не могу использовать локальную функцию в выражении 'if':

if is_prime(Counter)->
    problem_7(Counter, Primes + 1, Counter + 1);
   true ->
    problem_7(Current, Primes, Counter + 1)
end.

Мне просто интересно, есть ли способ использовать локальную функцию в страже и как я могу написать условие с локальной функцией?

1 Ответ

14 голосов
/ 28 июня 2011

Причиной ограничения набора допустимых выражений является то, что оценка защитного выражения должна быть гарантирована без побочных эффектов.http://www.erlang.org/doc/reference_manual/expressions.html (раздел 7.24)

Используйте оператор case внутри своей функции.Вы должны иметь возможность использовать локальную функцию в if и case.

Отредактировано: Согласитесь с @cthulahoops, я ошибался в if http://www.erlang.org/doc/reference_manual/expressions.html#id75927

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...