2016-09-29 31 views
6

Tôi đã cố gắng tìm ra điều này trong vài giờ qua mà không thành công gì.Trả lại tổng số danh sách phụ trong danh sách

Hãy nói rằng tôi có một danh sách liệt kê của int

let list = [[1;3;4;4];[1;3]] 

tôi phải tạo một hàm mà sẽ tổng hợp các danh sách con và trả lại một danh sách như sau:

[12;4] 

Tôi đã nói rằng tôi nên sử dụng List.fold.

Tôi đã thử những điều sau đây:

let list = [2;3;5] 
let sumList list = List.fold (fun acc elem -> acc + elem) 0 list 
sumList list 

này đang trở lại chỉ một int và chỉ hoạt động cho một danh sách int và không cho một danh sách các danh sách. Các bước tiếp theo từ đây là gì.

+1

List.map là gợi ý tiếp theo –

+0

Xin lỗi nếu tôi câm. Tôi rất mới trong lập trình chức năng. Tôi đã xem tài liệu cho List.map và tôi hiểu rằng nó áp dụng một hàm nhất định cho từng phần tử. tôi đã cố gắng để làm điều này: 'để cho danh sách sumLists = List.map (fun x -> List.fold (vui elem acc -> acc + elem) 0 Danh mục) ' được rõ ràng không phải làm việc –

+0

Đầu tiên, hãy viết một hàm sau đó tổng hợp một danh sách. Sau đó viết một hàm mới với list.map –

Trả lời

6

Hãy thử:

list 
|> List.map List.sum 

Vì vậy, bạn lập bản đồ List.sum cho mỗi phần tử trong danh sách.

Hoặc với lần:

list 
|> List.map (List.fold (+) 0) 

(List.fold (+) 0) cũng giống như chức năng tổng hợp. Nó bắt đầu bằng số không và thêm vào trong mỗi lần lặp giá trị cho bộ tích lũy.

list 
|> List.fold (fun acc v -> 
    acc @ [(List.fold (+) 0) v]) [] 

Như bạn thấy, bạn cũng có thể thay thế bản đồ bằng một nếp gấp.

list 
|> List.foldBack (fun v acc -> 
    (List.fold (+) 0 v) :: acc) 
    <| [] 

Với List.foldBack có vẻ tốt hơn một chút so với lần đọc của tôi. Nhưng tôi thích giải pháp đầu tiên.

+0

Cảm ơn! Thật tuyệt vời. –

+2

Và đừng quên '(list, []) ||> List.foldBack (vui v acc -> (List.fold (+) 0 v) :: acc)', mà tôi thấy dễ đọc hơn giải pháp cuối cùng (sử dụng '<|'). – ildjarn

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