2016-09-29 14 views
6

Próbuję to rozgryźć przez ostatnie kilka godzin bez powodzenia, jak zawsze.Zwraca sumę podlist na liście

Powiedzmy mam listę list int

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

muszę utworzyć funkcję, która będzie sumować listy zagnieżdżone i powrotu jednej listy, jak poniżej:

[12;4] 

I byli powiedział, że powinienem użyć List.fold.

Próbowałem następujące:

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

ten wraca tylko int i działa tylko na liście int a nie na liście listy. Jakie są następne kroki stąd.

+1

List.map to następna podpowiedź –

+0

Przepraszam, jeśli jestem głupi. Jestem bardzo nowy w programowaniu funkcjonalnym. Przyjrzałem się dokumentacji dla List.map i zrozumiałem, że stosuje ona daną funkcję do każdego elementu. Próbowałem to zrobić: 'niech lista sumLists = List.map (fun x -> List.fold (zabawa acc elem -> acc + elem) 0 lista)' która nie jest oczywiście praca –

+0

Najpierw napisać funkcja następnie sumuje listę. Następnie napisz nową funkcję z list.map –

Odpowiedz

6

Spróbuj:

list 
|> List.map List.sum 

więc odwzorować List.sum dla każdego elementu listy.

Albo z owczarni

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

(List.fold (+) 0) jest taka sama jak funkcja sumy. Zaczyna się od zera i dodaje w każdej iteracji wartość do akumulatora.

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

Jak widać, mapę można również zamienić na fałdę.

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

Z List.foldBack wygląda trochę lepiej moim zdaniem niż z owczarni. Ale wolę pierwsze rozwiązanie.

+0

Dzięki! To jest doskonałe. –

+2

I nie zapomnij '(list, []) ||> List.foldBack (fun v acc -> (List.fold (+) 0 v) :: acc)', które uważam za bardziej czytelne niż ostatnie rozwiązanie (używając '<||). – ildjarn