2011-12-15 35 views
11

Tôi có danh sách xxs và tôi cần tạo danh sách mới để thêm và tính các yếu tố từ danh sách cũ.Tạo danh sách mới bổ sung và tính tổng các phần tử từ danh sách cũ

Hãy để tôi vẽ nó để chứng minh:

visualization of list transformation

Vì vậy, tôi có danh sách:

xxs = [("a","b", [(1,"a","b"),(2,"a","b")]), ("c","d",[(3,"a","b"),(4,"a","b")])] 

cách tiếp cận tốt nhất của tôi cho đến nay là:

infoBasicas = [ (x,y,aux) | (x,y,_) <- xxs] 
    where aux = sum [ z | (_,_,ys) <- xxs, (z,_,_) <- ys] 

Output:

[("a","b",10),("c","d",10)] 

Mặc dù tôi không ở xa ... Tôi chưa hoàn toàn ở đó và sẽ thực sự đánh giá cao một số đề xuất.

+0

Vì vậy, các loại của 'xxs' là' [(String, Chuỗi, [(Số nguyên, Chuỗi, Chuỗi)])] '? Tại sao chính xác bạn có một giá trị với một loại khủng khiếp như vậy để bắt đầu? –

+0

Vâng ... đó là Bài tập về nhà. :/ – Nomics

Trả lời

7

Vấn đề với giải pháp của bạn là aux giống nhau đối với mỗi thành phần của xxs. khi bạn viết (x,y,_) <- xxs, bạn đang vứt bỏ danh sách với các số bạn muốn tính. Thay vào đó, hãy giữ danh sách đó, làm việc là một yếu tố tại một thời điểm, vì vậy:

infoBasicas = [(x, y, doSum innerList) | (x, y, innerList) <- xxs] 

Để tìm tổng các innerList s, bạn chỉ muốn những con số, vì vậy bạn có thể ném chúng đi. Sau đó được thực hiện, bạn là trái với một danh sách các số, mà chỉ có thể được tổng kết với tiêu chuẩn sum chức năng:

doSum list = sum (fst3 list) -- There is one small error here. Can you see what it is? 
fst3 (a, _, _) = a 

Không phải là chúng ta đang sử dụng fst3 đây, thay vì fst, vì đây là gấp ba, không cặp.

+0

'doSum list = sum (danh sách Fst3)' dòng này có lỗi. Nhưng có lẽ đó là chỉ đúng cho bài tập về nhà :-) – luqui

+0

Ồ, rất tiếc. Tôi đã chỉnh sửa nó để hiển thị. – gereeter

4

Bạn đã thực sự thân thiết!

Khi người dự bị nói: vấn đề chính của bạn là bạn đang sử dụng cùng một giá trị aux cho mọi thứ. Nếu bạn thay đổi aux thành một hàm lấy danh sách (Int,String,String) bộ dữ liệu thì nó sẽ hoạt động cho bạn.

infoBasicas = [ (x,y,aux z) | (x,y,z) <- xxs ] 
    where aux xs = sum [ z | (z,_,_) <- xs ] 

(Tôi đã không thực sự nói thêm bất cứ điều gì để trả lời gereeter của ngoại trừ việc thay đổi hình thức mẫu mã để chặt chẽ hơn với bạn.)

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