目前为止我们已经尝试写了些高阶函数代码。这回我们学着定义如下高阶函数:
f(g,a) = g(g(a))

该函数在得到函数g和传入g的参数a后计算g(a),并将结果作为再次调用函数g的参数。语言描述确实很复杂。
F#表示如下:
let f g a = g (g a)

使用Pipeline就可以改写成:
let f g a = g a |> g

C#的话可能会像这样:
public T f<T>(Func<T,T> g, T a) {
        return g(g(a));
}

F#就很简洁了。使用方法如下:
let add2 a = a + 2
printfn "%A" (f add2 5)
printfn "%A" (f (fun n -> n + 2) 5)

第二个printf传入了lambda表达式,两个运行的结果都是显示9。
我们再试着写一个高阶函数:一个和List.map有相同功能的map函数。
let map f lst = [ for n in lst -> f n ]
let nums = [1;2;3;4;5]
let triple n = n * 3
printfn "%A" (map triple nums)
printfn "%A" (List.map triple nums)

map的第一个参数是函数,并将该函数作用于第二个参数传入的list的各个元素上,然后生成一个新的list。
运行结果和List.map相同,显示:
[3; 6; 9; 12; 15]