Поделиться через


Функция 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
    Тип: 'Tlist

    Входной список.

Возвращаемое значение

Значение конечного состояния.

Заметки

В скомпилированных сборках имя этой функции — 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 8, Windows 7, Windows Server 2012, Windows 2008 Server R2

Сведения о версии

Основной версии библиотеки F#

Поддерживается в: 2.0, 4.0, портативное

См. также

Ссылки

Модуль Collections.List (F#)

Пространство имен Microsoft.FSharp.Collections (F#)