2012-06-21 29 views
6

Thực hiện một danh sách Erlang hiểu rằng phải mất hai yếu tố từ một danh sách và làm cho một danh sách mới của danh sách.Erlang: làm thế nào để thực hiện Erlang danh sách hiểu?

tôi có mã này

pair([], Acc) -> lists:reverse(Acc); 

pair(L, Acc0) -> 
    [ A, B | T ] = L, 
    Acc = [ [A, B] | Acc0 ], 
    pair(T, Acc). 

mà hoạt động tốt:

7> l:pair(lists:seq(1,6), []). 
[[1,2],[3,4],[5,6]] 

nhưng nó có vẻ như tôi sẽ có thể thực hiện điều này như một sự hiểu biết danh sách. Erlang-fu của tôi quá yếu để nghĩ ra.

Mọi đề xuất?

Cảm ơn

Trả lời

1

Một danh sách hiểu sẽ phiền phức bởi vì nó chắc chắn phải làm điều gì đó cho mỗi yếu tố của danh sách. Để tạo ra một danh sách hiểu bạn phải do đó cố gắng tìm hiểu xem đó là một yếu tố thậm chí hoặc lẻ bạn đang nói đến. Dưới đây là một ý tưởng về những gì tôi đang nói về:

pair(L) -> 
    L2 = lists:zip(lists:seq(1, length(L)), L), 
    [[A, B] || {Ai, A} <- L2, {Bi, B} <- L2, 
      Ai rem 2 == 1, Bi rem 2 == 0, Ai + 1 == Bi]. 

Sự phức tạp thời gian trên này có lẽ là khủng khiếp vì như xa như tôi biết Erlang không tối ưu hóa này dưới mọi hình thức.

Tôi không nghĩ có bất kỳ điều gì sai với chức năng của bạn và bạn nên gắn bó với nó.

8

Không, việc hiểu danh sách sẽ không phải là cách tốt để làm điều đó, theo định nghĩa, chúng chỉ hoạt động trên một phần tử một lần. Trong mã của bạn có thực sự không cần phải sử dụng một ắc quy, sự khác biệt về tốc độ là nhỏ, here, và nó trở nên rõ ràng hơn mà không có nó. Tôi nghĩ vậy ít nhất.

pairs([A,B|L]) -> 
    [[A,B]|pairs(L)]; 
pairs([]) -> []. 
+1

Điều này tuân theo câu thần chú Erlang "cho phép sự cố", ví dụ: đối với vụ án '[a]'. – Tilman

+0

@Tilman Có, chức năng được ** xác định ** để nhận các cặp thành phần vì vậy nếu đó là lỗi nếu có một số lẻ các phần tử trong danh sách. Tất nhiên bạn có thể định nghĩa điều gì sẽ xảy ra trong trường hợp đó và xử lý nó sau đó. – rvirding

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