这回我们继续通过List学习高阶函数。

------------------------
partition函数:
let lst1 = [1;2;3;4;5]
let (x,y) = List.partition    (fun n -> n % 2 = 0) lst1
printfn "%A" x
printfn "%A" y
运行结果是:
[2; 4]
[1; 3; 5]
效果确实和函数名一样,根据条件对list进行了分割。

------------------------
fold函数
let lst1 = [1;2;3;4;5]
let x = List.fold (fun (s:int) (n:int) -> s + n) 0 lst1
printfn "%A" x

运行的结果显示了1+2+3+4+5的和:15。
fold算是最难解释的一个函数了。作用同LINQ的Aggregate一样。不过考虑到了解的人还是很少,这里就简单说明下上述代码的:
Step 1
初始值:传入0(第2个参数)
Step 2
调用lambda表达式
此时将list的第1个元素的值存入n中
s值为Step1传入的0
执行n + s,保存结果
Step 3
调用lambda表达式
此时将list的第2个元素的值存入n中
s值为Step2的计算结果
执行n + s(即2+1),保存结果
...
如此反复,直至遍历了所有的元素。
也就是说本例执行了1 + 2 + 3 + 4 + 5 。
现在我们就利用fold再写一段代码。
let lst2 = ['a';'b';'c';'d';'e']
let x = List.fold (fun (s:string) (n:char) ->
        if s.Length = 0 then n.ToString() else s + "-" + n.ToString()) "" lst2
printfn "%A" x
运行结果是:"a-b-c-d-e"。
感觉确实做得有点过了。如果再复杂点恐怕就写不了了,就此为止吧。

------------------------
choose函数
let lst3 = [1;2;3;4;5]
let q = List.choose (fun (n:int) -> if n % 2 = 0 then Some (n*2) else None) lst3
printfn "%A" q

运行结果是: [4; 8] 。None的时候的动作可能就是无法加入元素。
感觉是filter和map联合作用的函数。我们就试着利用 filter和map实现下吧!
let lst4 = [1;2;3;4;5]
let q1 = lst4
                 |> List.filter (fun (n:int) -> n % 2 = 0)
                 |> List.map (fun (n:int) -> n * 2)
printfn "%A" q1
确实可以,不过还是使用choose简洁多了。