2010-08-31 15 views
13

He comenzado algunas manos en Erlang y recibo: ** 1: syntax error before: '->' ** cada vez que declaro alguna función para, p. Ej. para calcular la suma de una lista (esto es experimental, de cource hay una función incorporada para encontrar la suma de una lista).Erlang getting error ** 1: error de sintaxis antes: '->' **

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

en erl shell (v 5.5.5).

Gracias de antemano

Respuesta

34

no se pueden definir funciones dentro de la cáscara utilizando la misma sintaxis que en un archivo de ERL.

Aunque puede definir la diversión.

de sintaxis en la cáscara necesita ser:

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

Nota que funciones anónimas recursivas (que esto es) se definen de una manera fea. Básicamente, debes pasar la función como un argumento a sí mismo.

+4

o alias: want functions in shell? ¡Que te diviertas! –

+1

Ojalá el mensaje de error fuera más útil. – dotslash

8

La respuesta directa es que en un archivo de definición de módulo tiene atributos, como -module()., -export(). etc., y definiciones de funciones, mientras que en el intérprete de comandos ingresa expresiones para evaluar. Una definición de función no es una expresión.

Si desea definir una función local temporal en el shell, debe usar fun como se muestra @DanielLuna. Estas son funciones realmente anónimas sin nombre, por lo que llamarse recursivamente es una molestia, que no es específica de Erlang sino que es común a todas las funciones anónimas.

N.B.

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

en shell no NO definir una función llamada Sum pero define una función anónima y se une al variable deSum a ella.

Por esta razón, lo único que puede hacer en un módulo es definir funciones y no expresiones para evaluar cuando se carga el módulo.

+0

Gracias, llegué a la forma correcta de declarar las funciones de módulo y exportación. – pranjal

0

O utilice las listas: función foldl/2. Esto se copia directamente del Manual de referencia de Erlang.

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