2011-12-15 27 views
13

Tôi đang triển khai thuật toán điểm-điểm-đa giác của javascript theo kiểu thuần túy chức năng (không có lý do cụ thể nào đằng sau nó).Có thể triển khai phiên bản js của giải nén Haskell theo cách hoàn toàn chức năng không?

Tôi gặp khó khăn khi cần thiết để lấy hai mảng từ mảng 2 chiều (sao chép danh sách các bộ dữ liệu); một cái gì đó giống như của Haskell unzip.

Có thể, bắt đầu từ một cái gì đó như [[a,b],[c,d],[e,f]] để có được [[a,c,e],[b,d,f]] mà không sử dụng trình vòng lặp theo thủ tục kiểu?

(Tôi biết đó là một câu hỏi tầm thường, và tôi chỉ có thể thực hiện các chức năng procedurally và sau đó quên nó đi, nhưng tôi đã tò mò muốn biết nếu có một giải pháp)


EDIT: Để làm rõ, Tôi biết làm thế nào để thực hiện zipunzip: Tôi đã tự hỏi rằng nó có thể có thể thực hiện chúng mà không có các vòng lặp for và phân bổ lại biến.

+0

Với sự khác biệt giữa biểu diễn của JavaScript và Haskell của danh sách, chúng không thể được triển khai theo cùng một cách. Haskell thực hiện các danh sách như là một cấu trúc bất biến được liên kết đơn lẻ. Java thực hiện các danh sách dưới dạng một mảng có thể thay đổi. Đối với trước đây, bạn sử dụng đệ quy và khớp mẫu. Đối với thứ hai, bạn sử dụng cho các vòng lặp và các chỉ mục. –

+0

Hm, tôi biết Js không có danh sách. Tôi đã đề cập đến một chức năng cụ thể, trong một miền bị hạn chế - tôi không cần nó để làm việc trên "mảng vô hạn" (lulz) hoặc như vậy. – cbrandolino

Trả lời

6

Giải nén của bạn chỉ là mã zip nhưng có nhiều đối số. Lý do duy nhất mà hầu hết mọi người không chỉ sử dụng cùng chức năng là hầu hết thời gian zip nhận danh sách các đối số variadic thay vì một mảng, do đó bạn cần giải nén mọi thứ với apply trong chức năng giải nén.

Trong Dojo, thư viện Tôi đang sử dụng, họ thực hiện zip và giải nén như

unzip: function(/*Array*/ a){ 
    // summary: similar to dojox.lang.functional.zip(), but takes 
    // a single array of arrays as the input. 
    // description: This function is similar to dojox.lang.functional.zip() 
    // and can be used to unzip objects packed by 
    // dojox.lang.functional.zip(). It is here mostly to provide 
    // a short-cut for the different method signature. 

    return df.zip.apply(null, a); 
} 

zip: function(){ 
    // summary: returns an array of arrays, where the i-th array 
    // contains the i-th element from each of the argument arrays. 
    // description: This is the venerable zip combiner (for example, 
    // see Python documentation for general details). The returned 
    // array is truncated to match the length of the shortest input 
    // array. 
    var n = arguments[0].length, 
     m = arguments.length, 
     i = 1, 
     t = new Array(n), 
     j, 
     p; 
    for(; i < m; n = Math.min(n, arguments[i++].length)); 
    for(i = 0; i < n; ++i){ 
     p = new Array(m); 
     for(j = 0; j < m; p[j] = arguments[j][i], ++j); 
     t[i] = p; 
    } 
    return t; 
}, 

Lưu ý rằng nén nhận được nhiều tranh cãi vì vậy nó là như zip Python và ít giống như một Haskell.


Nó không nên khó để conver mã này vào một phong cách "hoàn toàn chức năng" không có nhiệm vụ biến. Mã hiện tại của bạn đã được xử lý công việc của hai lần đầu tiên trong ví dụ tôi đã đăng (cắt ngắn mã zip ở độ dài tối thiểu và lặp qua các chỉ mục của một trong các danh sách). Tất cả những gì còn lại là làm một điều tương tự cho lần thứ ba - thu thập giá trị thứ i từ danh sách các danh sách thay vì thu thập hai giá trị từ hai danh sách.

+0

Cảm ơn! Tôi đã lang thang, mặc dù, cho dù đó có thể được thực hiện mà không sử dụng iterators thủ tục như 'for'. – cbrandolino

+0

Mã của bạn phải đang thực hiện công việc của hai lần đầu tiên trong ví dụ tôi đã đăng (cắt ngắn mã zip ở độ dài tối thiểu và lặp qua các chỉ mục của một trong các danh sách). Tất cả những gì bạn cần làm là công việc của người thứ ba - thu thập giá trị thứ i từ danh sách các danh sách thay vì thu thập hai giá trị từ hai danh sách. – hugomg

+0

Tôi sẽ không recomment mã đệ quy cao trong loại chức năng thư viện hiệu suất nhạy cảm mặc dù. Nhưng sau đó tôi đoán bạn không thực sự tâm trí trong trường hợp này. – hugomg

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