В дополнение к тому, что сказал Ли, вы можете определить reduce
в терминах fold
, но не (легко) наоборот:
let reduce f list =
match list with
| head::tail -> List.fold f head tail
| [] -> failwith "The list was empty!"
Тот факт, что fold
занимаетЯвное начальное значение для аккумулятора также означает, что результат функции fold
может иметь тип, отличный от типа значений в списке.Например, вы можете использовать аккумулятор типа string
, чтобы объединить все числа в списке в текстовое представление:
[1 .. 10] |> List.fold (fun str n -> str + "," + (string n)) ""
При использовании reduce
тип аккумулятора совпадает с типомЗначения в списке - это означает, что если у вас есть список чисел, результатом должен быть номер.Чтобы реализовать предыдущий пример, вам нужно сначала преобразовать числа в string
, а затем накопить:
[1 .. 10] |> List.map string
|> List.reduce (fun s1 s2 -> s1 + "," + s2)