2011-06-28 22 views
9

Dưới đây là mã của tôi:Có cách nào để sử dụng chức năng địa phương trong việc bảo vệ

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). 

tôi nhận được lỗi:

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

Và tôi không thể sử dụng chức năng địa phương trong 'if' thể hiện :

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

Tôi chỉ tự hỏi liệu có cách nào để sử dụng chức năng cục bộ để bảo vệ và cách tôi có thể viết điều kiện bằng chức năng cục bộ không?

Trả lời

13

Lý do hạn chế tập hợp các biểu thức hợp lệ là việc đánh giá biểu thức bảo vệ phải được đảm bảo không có tác dụng phụ. http://www.erlang.org/doc/reference_manual/expressions.html (phần 7.24)

Sử dụng câu lệnh case bên trong chức năng của bạn. Bạn sẽ có thể sử dụng chức năng cục bộ trong if case.

được sửa đổi: Đồng ý với @cthulahoops, tôi đã sai về ifhttp://www.erlang.org/doc/reference_manual/expressions.html#id75927

+3

Trong trường hợp khoản, vâng, nhưng nếu điều khoản giống như bảo vệ và chịu sự hạn chế tương tự. – cthulahoops

Các vấn đề liên quan