【问题标题】:Is there a way to use local function in guard有没有办法在守卫中使用本地功能
【发布时间】:2024-06-30 09:00:01
【问题描述】:

这是我的代码:

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.

我只是想知道是否有任何方法可以在守卫中使用本地函数以及如何使用本地函数编写条件?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    限制有效表达式集的原因是保护表达式的求值必须保证没有副作用。 http://www.erlang.org/doc/reference_manual/expressions.html(第 7.24 节)

    在你的函数中使用case 语句。您应该可以在 ifcase 中使用本地函数。

    已编辑:同意@cthulahoops,我错了ifhttp://www.erlang.org/doc/reference_manual/expressions.html#id75927

    【讨论】:

    • in case 子句是的,但是 if 子句就像守卫一样,受到同样的限制。