Возвращает сумму подсписка в списке

#f#

#f#

Вопрос:

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

Допустим, у меня есть список списков int

 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, а не для списка list . Каковы следующие шаги отсюда.

Комментарии:

1. List.map — следующая подсказка

2. Извините, если я тупой. Я очень новичок в функциональном программировании. Я просмотрел документацию для List.map и понял, что он применяет заданную функцию к каждому элементу. Я пытался сделать это: let sumLists list = List.map (fun x -> List.fold (fun acc elem -> acc elem) 0 list) что, очевидно, не работает

3. Сначала напишите функцию, затем суммируйте список. Затем напишите новую функцию с помощью list.map

Ответ №1:

Попробуйте:

 list 
|> List.map List.sum
  

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

Или с помощью fold:

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

(List.fold ( ) 0) совпадает с функцией sum . Он начинается с нуля и добавляет на каждой итерации значение в накопитель.

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

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

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

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

Комментарии:

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