函数式编程学习之路(八)

针对函数式编程的两大粘性演练:

高阶函数:

    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传点东西进去,它是有限制的。

现在好了。是我要输出点东西,然后我把“输出”传进去,逆天了。然后你的东西就被输出了。这种反向扩展,在银河系漫游系列里有个屋子。这个屋子的门向里开,不是进去的,是出来的。要出到屋子的外面,你必须从“门”里进去,要不然,你是一直在屋子里的。

由此可见反向扩展之威力!

 

惰性求值:

待续……

posted @ 2013-04-24 22:39  人工智能-群513704292  阅读(253)  评论(1编辑  收藏  举报