• 函数式编程学习之路(六) 人工智能


    找到点干货:

    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),那肯定是变化后的值了.真是神奇.

  • 相关阅读:
    mysql操作
    Linux内核事件通知链学习
    C++双端队列学习
    tune的结果图是什么
    conda环境备份
    Could not load dynamic library 'libcudart.so.11.0';
    Unexpected error while saving file: xxx.ipynb database or disk is full
    友元函数与友元类
    构造函数初始化必须采用初始化列表的情况
    模型集成04-GMM
  • 原文地址:https://www.cnblogs.com/DSharp/p/3031686.html
Copyright © 2020-2023  润新知