2010-08-31 12 views
13

Ho iniziato alcune mani in Erlang e sto ottenendo: ** 1: syntax error before: '->' ** ogni volta che sto dichiarando qualsiasi funzione per es. per calcolare la somma di una lista (questo è sperimentale, di cource c'è Built In Function per trovare la somma di una lista).Errore di errore di Erlang ** 1: errore di sintassi prima: '->' **

sum([]) -> 0; 
sum([H | T]) -> H + sum(T). 

in shell erl (v 5.5.5).

Grazie in anticipo

risposta

34

Non è possibile definire funzioni nella shell usando la stessa sintassi in un file di Erl.

È possibile definire divertente.

sintassi nel guscio deve essere:

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end, 
Sum([1,2,3], Sum). 

noti che funzioni anonime ricorsive (che è) sono definiti in modo brutto. Fondamentalmente devi passare la funzione come argomento a se stessa.

+4

aka: desidera funzioni in shell? Divertiti! –

+1

Vorrei che il messaggio di errore fosse più utile. – dotslash

8

La risposta diretta è che in un file di definizione del modulo si hanno attributi, come -module()., -export(). ecc. E le definizioni di funzione, mentre nella shell si immettono espressioni da valutare. Una definizione di funzione non è un'espressione.

Se si desidera definire una funzione locale temporanea nella shell, è necessario utilizzare fun's come @DanielLuna ha mostrato. Queste sono funzioni anonime anonime, quindi chiamarsi ricorsivamente è un dolore, che non è specifico di Erlang ma comune a tutte le funzioni anonime.

N.B.

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end. 

in guscio fa NON definire una funzione denominata Sum ma definisce una funzione anonima e lega il variabileSum ad esso.

Questo è anche il motivo per cui l'unica cosa che si può fare in un modulo è definire funzioni e non espressioni da valutare quando il modulo viene caricato.

+0

Grazie, ho trovato il modo giusto di dichiarare il modulo e le funzioni di esportazione. – pranjal

0

Oppure utilizzare gli elenchi: funzione foldl/2. Questo viene copiato direttamente dal Manuale di riferimento di Erlang.

1> lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]). 
15 
Problemi correlati