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

    找到点干货:

    PROFESSIONAL FUNCTIONAL PROGRAMMING IN C#

    看了下目录,正是我想要的,同时也发现,函数式编程果然博大精深,看目录,就有第一次看编程语言或是面向对象的感觉,里面的章节,基本上没有一个概念是熟悉的.

    先从中文目录起把概念列出来:

    惰性列表:迭代器

    闭包

    表达式树

    局部套用

    部分应用

    惰性求值

    缓存技术

    递归调用

    高阶函数

    序列

    组合函数

    可选值

    防止数据变化

    单子

    实际应用

    MapReduce 模式


    看了下目录,很多名词都无法直观表述,容易误解,我看还是看原版吧,顺便把E语学了.以防再重走以前学面向对象的老路(初学时搞不清楚对象是什么东西.后来知道是object,物体,东西,反而更容易理解了).

    先来Currying:

    Func <  int, int, int  >  add = (x, y) =>  x + y;

    作者也是用加减乘除举例子,这就很有趣了.原来问题是一致的.正等解决方案呢.

    var   add = (x, y) =>  x + y;不行,果然是C#还不支持,作者也在吐

    Func < int, Func < int, int > > curriedAdd = x => y => x + y;
    int i = curriedAdd(5)(6);

    啊,原来Curring这么简单.和int result = addition(1, multiplication(2, subtraction(3, 1)))不一样了.

    先不管Curring后到底能干什么,起码我们有了.但作者吐的东西就是,参数多了,定义复杂,所以绕了个圈子.

       Automatic Currying

    public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
    {
    return par1 => par2 => func(par1, par2);
    }

    然后就可以:

    var v = Curry((int x, int y) => x + y);
    var v1 = Curry<int, int, int>((x, y) => x + y);


    int a = 1;
    int j = v(a)(a);
    var v3 = v1(a);
    int k = v3(1);
    a = 100;
    int l = v3(1);

    果然神奇的事情发生了, l值不受a变量改变的影响,函数式编程里的无副作用果然实现.

    而传统两参数add(1, a)时,a变了,再调用add(1,a),那肯定是变化后的值了.真是神奇.

  • 相关阅读:
    video全屏视频背景适配不同分辨率
    深入理解object.defineproperty()方法
    抓取之近似网页过滤
    基情四射的两个css样式
    Hadoop 2.4.1 登录认证配置小结
    Window中调试HBase问题小结
    改了改博客界面
    Hbase0.98.4/Hadoop2.4.1整合小结【原创】
    Hadoop 2.4.1 Map/Reduce小结【原创】
    hadoop的dfs工具类一个【原创】
  • 原文地址:https://www.cnblogs.com/DSharp/p/3031686.html
Copyright © 2011-2022 走看看