函数式编程学习之路(八)
针对函数式编程的两大粘性演练:
高阶函数:
public class MapClass : IWrite { public static IEnumerable<TResult> Map<T, TResult>(IEnumerable<T> list, Func<T, TResult> func) { foreach(T t in list) { yield return func(t); } } public static void Map<T>(IEnumerable<T> list, Action<T> func) { foreach (T t in list) { func(t); } } public void Write() { int[] list = { 1, 2, 3 }; var result = Map<int, int>(list, x => x * 2); Map<int>(result, x => Console.WriteLine(x)); Console.ReadKey(); } public static void Run() { new MapClass().Write(); } }
理解这个东东后,果然感觉很多计算变得轻松了。最直接的做法就是把一堆数据,和某种操作粘合起来。一下子,你就觉得函数功能被“扩展”了。给传统僵化的函数,插了了年轻的想象翅膀。
它还有个很直觉的东西就是,计算“反向化”了。
比如:Map<int>(result, x => Console.WriteLine(x));
传统思维,我要输出东西是要给WriteLine传点东西进去,它是有限制的。
现在好了。是我要输出点东西,然后我把“输出”传进去,逆天了。然后你的东西就被输出了。这种反向扩展,在银河系漫游系列里有个屋子。这个屋子的门向里开,不是进去的,是出来的。要出到屋子的外面,你必须从“门”里进去,要不然,你是一直在屋子里的。
由此可见反向扩展之威力!
惰性求值:
待续……