| method name | description |
|---|---|
| fold | the base accumulator method to accumulate a collection |
| fold2 | the variation of fold method to accumulate two collections |
| scan | the variation of fold method to return not only last result and but also intermediate results |
| reduce | the special usage of fold method if both accumulator and elements are in same type |
And collection classes have opposite accumulator methods - foldBack, foldBack2, scanBack and reduceBack. These methods are "reversed" - not only the order to scan collection but also the order of arguments for collection and initial accumulator.
I wrote a sample code using accumulator, pipe(|>) and composition(<<). This sample is of FizzBuzz on MapReduce.Microsoft (R) F# 2.0 Interactive build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
For help type #help;;
> let fizzBuzzMapper data =
- List.map ( fun elem -> (elem, (elem % 3 = 0), (elem % 5 = 0) ) ) data;;
val fizzBuzzMapper : int list -> (int * bool * bool) list
> [1..40] |> fizzBuzzMapper;;
val it : (int * bool * bool) list =
[(1, false, false); (2, false, false); (3, true, false); (4, false, false);
(5, false, true); (6, true, false); (7, false, false); (8, false, false);
(9, true, false); (10, false, true); (11, false, false); (12, true, false);
(13, false, false); (14, false, false); (15, true, true);
(16, false, false); (17, false, false); (18, true, false);
(19, false, false); (20, false, true); (21, true, false);
(22, false, false); (23, false, false); (24, true, false);
(25, false, true); (26, false, false); (27, true, false);
(28, false, false); (29, false, false); (30, true, true);
(31, false, false); (32, false, false); (33, true, false);
(34, false, false); (35, false, true); (36, true, false);
(37, false, false); (38, false, false); (39, true, false);
(40, false, true)]
> let fizzBuzzReducer interims =
- List.foldBack (fun (elem, m3, m5) acc ->
- match (m3, m5) with
- | (true, true) -> "FizzBuzz" :: acc
- | (true, false) -> "Fizz" :: acc
- | (false, true) -> "Buzz" :: acc
- | _ -> elem.ToString() :: acc ) interims [];;
val fizzBuzzReducer : ('a * bool * bool) list -> string list
> [1..40] |> fizzBuzzMapper |> fizzBuzzReducer;;
val it : string list =
["1"; "2"; "Fizz"; "4"; "Buzz"; "Fizz"; "7"; "8"; "Fizz"; "Buzz"; "11";
"Fizz"; "13"; "14"; "FizzBuzz"; "16"; "17"; "Fizz"; "19"; "Buzz"; "Fizz";
"22"; "23"; "Fizz"; "Buzz"; "26"; "Fizz"; "28"; "29"; "FizzBuzz"; "31";
"32"; "Fizz"; "34"; "Buzz"; "Fizz"; "37"; "38"; "Fizz"; "Buzz"]
> [1..40] |> (fizzBuzzReducer << fizzBuzzMapper) |> List.iter (fun elem -> System.Console.WriteLine(elem));;
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
val it : unit = ()
No comments:
Post a Comment