zoukankan      html  css  js  c++  java
  • 函数式编程学习之路(八) 人工智能

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

    高阶函数:

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

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

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

    惰性求值:

    待续……

  • 相关阅读:
    基于typora编写Markdown文档
    VMware Workstation常见的故障处理
    VMware Workstation产品常用的快捷键
    2
    1
    9
    8
    7
    6
    5
  • 原文地址:https://www.cnblogs.com/DSharp/p/3041317.html
Copyright © 2011-2022 走看看