Функция List.fold<'T,'State> (F#)
Применяет функцию f к каждому элементу коллекции, передавая накапливаемое значение аргумента по потоку в процессе вычисления. Функция fold принимает второй аргумент и применяет функцию f к нему и к первому элементу списка. Затем этот результат передается в функцию f вместе со вторым элементом и т. д. Она возвращает конечный результат. Если входная функция — f, а элементы — i0...iN, эта функция вычисляет f (... (f s i0) i1 ...) iN.
Пространство имен/путь к модулю: Microsoft.FSharp.Collections.List
Сборка: FSharp.Core (в FSharp.Core.dll)
// Signature:
List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State
// Usage:
List.fold folder state list
Параметры
folder
Тип: 'State -> 'T -> 'StateФункция для обновления состояния на основании входных элементов.
state
Тип: 'StateНачальное состояние.
list
Тип: 'T listВходной список.
Возвращаемое значение
Значение конечного состояния.
Заметки
В скомпилированных сборках имя этой функции — Fold. При обращении к функции из языка, отличного от F#, или посредством отражения следует использовать это имя.
Пример
Следующий пример демонстрирует использование List.fold
let data = [("Cats",4);
("Dogs",5);
("Mice",3);
("Elephants",2)]
let count = List.fold (fun acc (nm,x) -> acc+x) 0 data
printfn "Total number of animals: %d" count
Следующий пример кода иллюстрирует дополнительные использования List.fold. Обратите внимание, что существуют библиотечные функции, которые инкапсулируют реализованную ниже функциональную возможность. Например List.sum можно использовать для суммирования всех элементов списка.
let sumList list = List.fold (fun acc elem -> acc + elem) 0 list
printfn "Sum of the elements of list %A is %d." [ 1 .. 3 ] (sumList [ 1 .. 3 ])
// The following example computes the average of a list.
let averageList list = (List.fold (fun acc elem -> acc + float elem) 0.0 list / float list.Length)
// The following example computes the standard deviation of a list.
// The standard deviation is computed by taking the square root of the
// sum of the variances, which are the differences between each value
// and the average.
let stdDevList list =
let avg = averageList list
sqrt (List.fold (fun acc elem -> acc + (float elem - avg) ** 2.0 ) 0.0 list / float list.Length)
let testList listTest =
printfn "List %A average: %f stddev: %f" listTest (averageList listTest) (stdDevList listTest)
testList [1; 1; 1]
testList [1; 2; 1]
testList [1; 2; 3]
// List.fold is the same as to List.iter when the accumulator is not used.
let printList list = List.fold (fun acc elem -> printfn "%A" elem) () list
printList [0.0; 1.0; 2.5; 5.1 ]
// The following example uses List.fold to reverse a list.
// The accumulator starts out as the empty list, and the function uses the cons operator
// to add each successive element to the head of the accumulator list, resulting in a
// reversed form of the list.
let reverseList list = List.fold (fun acc elem -> elem::acc) [] list
printfn "%A" (reverseList [1 .. 10])
Output
Платформы
Windows 7, Windows Vista с пакетом обновления 2 (SP2), Windows XP с пакетом обновления 3 (SP3), Windows XP x64 с пакетом обновления 2 (SP2), Windows Server 2008 R2, Windows Server 2008 с пакетом обновления 2 (SP2), Windows Server 2003 с пакетом обновления 2 (SP2)
Сведения о версии
Среда выполнения F#
Поддерживается в версиях 2.0, 4.0
Silverlight
Поддерживается в версии 3
См. также
Ссылки
Пространство имен Microsoft.FSharp.Collections (F#)
Журнал изменений
Дата |
Журнал |
Причина |
---|---|---|
Май 2010 |
Добавлен пример кода. |
Улучшение информации. |