2015-09-27 10 views
5

Ho appena iniziato l'apprendimento Erlang, ma io non riesco a capire il motivo per cui questo codice non corrisponde al test di chiamata di funzione: sum (3)espressioni della Guardia di Erlang: utilizzando "e" contro l'utilizzo di "virgola"

-module(test). 
-export([sum/1]). 

sum(0) -> 0; 
sum(N) when is_integer(N) and N>0 -> N + sum(N - 1). 

... mentre questo fa:

-module(test). 
-export([sum/1]). 

sum(0) -> 0; 
sum(N) when is_integer(N), N>0 -> N + sum(N - 1). 

mi sto perdendo qualcosa circa i due approcci differenti?

risposta

6

Questo sta accadendo a causa della precedenza dell'operatore.

Come definito nella reference, operatore and viene prima >, quindi quello che effettivamente ottenere nel vostro primo frammento di codice è:

sum(N) when (is_integer(N) and N)>0 -> N + sum(N - 1). 

Quindi nel tuo caso si confrontano (true and 3) > 0, che non può essere vero , ecco perché la tua guardia non si abbina mai.

Per risolvere questo problema è possibile scrivere la guardia in questo modo:

sum(N) when (is_integer(N)) and (N>0) -> N + sum(N - 1). 

P.S. Le parentesi per is_integer/1 non sono necessarie in questo scenario, ma potrebbero apparire più chiare in questo modo.

+0

btw, is_integer (N) non può prendere tra parentesi –

+0

Inoltre, 'e' non è un corto (come', 'fa), quindi' andalso' dovrebbe essere preferito. –