2010-08-31 27 views
13

Tôi đã bắt đầu một số hoạt động trên Erlang và tôi nhận được: ** 1: syntax error before: '->' ** bất cứ khi nào tôi khai báo bất kỳ hàm nào cho ví dụ. để tính tổng của một danh sách (đây là thử nghiệm, của cource có Built In Function để tìm tổng của một danh sách).Erlang nhận lỗi ** 1: lỗi cú pháp trước: '->' **

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

trong vỏ erl (v 5.5.5).

Cảm ơn trước

Trả lời

34

Bạn không thể xác định các hàm trong trình bao sử dụng cùng cú pháp như trong tệp erl.

Bạn có thể xác định điều thú vị.

Cú pháp trong vỏ cần phải được:

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

Lưu ý rằng chức năng ẩn danh đệ quy (mà đây là) được định nghĩa một cách xấu xí. Về cơ bản, bạn phải chuyển hàm như một đối số cho chính nó.

+4

aka: muốn chức năng trong trình bao? Chúc vui vẻ! –

+1

Tôi muốn thông báo lỗi hữu ích hơn. – dotslash

8

Câu trả lời thẳng là trong tệp định nghĩa mô-đun bạn có các thuộc tính, như -module()., -export(). v.v. và định nghĩa hàm, trong khi trong trình bao, bạn nhập biểu thức cần đánh giá. Định nghĩa hàm không phải là một biểu thức.

Nếu bạn muốn xác định hàm cục bộ, tạm thời trong trình bao, bạn cần sử dụng tính năng thú vị như @DanielLuna đã hiển thị. Đây là những chức năng vô danh vô danh, do đó việc tự gọi mình đệ quy là một nỗi đau, điều này không cụ thể đối với Erlang nhưng lại phổ biến với tất cả các chức năng ẩn danh.

N.B.

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

trong vỏ làm KHÔNG định nghĩa một hàm gọi là Sum nhưng định nghĩa một chức năng ẩn danh và liên kết với các biếnSum với nó.

Đây cũng là lý do tại sao điều duy nhất bạn có thể thực hiện trong mô-đun là xác định hàm và không biểu thức được đánh giá khi mô-đun được tải.

+0

Cảm ơn, tôi đã đi đúng cách để khai báo các hàm mô-đun và xuất. – pranjal

0

Hoặc sử dụng danh sách: chức năng foldl/2. Điều này được sao chép trực tiếp từ Hướng dẫn tham khảo Erlang.

1> lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]). 
15 
Các vấn đề liên quan