2016-09-29 4 views
6

Я пытался понять это в течение последних нескольких часов без каких-либо успехов.Возвращаемая сумма подсписок в списке

Скажем, у меня есть список списков междунар

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

Я должен создать функцию, которая будет суммировать подсписки и возвращает один список, как показано ниже:

[12;4] 

Я был сказал, что я должен использовать List.fold.

Я попытался следующие:

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

это возвращается лишь Int и работает только для списка Int, а не для списка списка. Каковы следующие шаги отсюда.

+1

List.map - это следующий намек –

+0

Извините, если я немой. Я очень новичок в функциональном программировании. Я посмотрел документацию для List.map, и я понял, что она применяет данную функцию к каждому элементу. Я пытался сделать это: 'пусть список sumLists = List.map (весело х -> List.fold (весело согласно элем -> акк + элем) 0 список)' , который, очевидно, не работает –

+0

Во-первых, написать функция затем суммирует список. Затем напишите новую функцию с list.map –

ответ

6

Try:

list 
|> List.map List.sum 

Так вы карту List.sum для каждого элемента в списке.

Или с складкой:

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

(List.fold (+) 0) таким же, как функция суммы. Он начинается с нуля и добавляет в каждую итерацию значение для аккумулятора.

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

Как вы видите, вы также можете заменить карту сгибом.

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

С List.foldBack это выглядит, на мой взгляд, немного лучше, чем со складкой. Но я предпочитаю первое решение.

+0

Спасибо! Это отлично. –

+2

И не забывайте '(list, []) ||> List.foldBack (fun v acc -> (List.fold (+) 0 v) :: acc)', который я считаю более читаемым, чем последнее решение (используя '<|'). – ildjarn