#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)
, что я нахожу более читаемым, чем последнее решение (с использованием<|
).