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

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

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

    惰性求值:

    待续……

  • 相关阅读:
    IDEA如何打包可运行jar的一个问题。
    从一个脚本谈loadrunner的脚本初始化
    explain 用法详解
    linux zip 命令详解
    Jmeter使用——参数化
    Jmeter Constant Throughput Timer 使用
    产生随机时间的例子
    Mysql的列索引和多列索引(联合索引)
    Loadrunner负载机agent
    Spring context:property-placeholder 一些坑
  • 原文地址:https://www.cnblogs.com/DSharp/p/3041317.html
Copyright © 2011-2022 走看看