何为高阶函数

大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的。只要我们的函数的参数能够接收函数,或者函数能够返回函数,当然动态生成的也包括在内。那么我们就将这类函数叫做高阶函数。但是今天我们的标题并不是高阶函数,而是标准高阶函数,既然加上了这个标准,就意味着在函数式编程中有一套标准的函数,便于我们每次调用。而今天我们将会介绍三个标准函数,分别为Map、Filter、Fold。

Map

这个函数的作用就是将列表中的每项从A类型转换到B类型,并形成一个新的类型。下面我们可以看看在FCSLib中是如何实现的:

相信很多人应该都能够看懂这段代码,仅仅只是循环list数据。然后调用convert函数转换,最后通过yield将其组成一个列表返回。下面我们通过一个简单的例子来演示下如何使用这个标准高阶函数:

我们通过声明了一个数组data,然后利用map函数将其中的ID提取出来,单独形成一个列表。

Filter

通过名字应该能够猜出他大概的含义了,就是用来过滤数据的。相信一些人能够根据上面写出这个标准高阶函数的具体实现,当然这里不管读者有没有写出,我们都来看看FCSLib中是如何实现的:

这里我们只是少了一个泛型参数,对应的第一参数的是能够接收T类型返回bool类型的函数(Predicate也是.NET自带的,可能我们用惯了FuncAction,并且利用Func<T,bool>也可以实现一样的效果。),而语句主要是在循环后调用了predicate去判断是否满足条件,如果满足条件则返回。

Fold

这个标准高阶函数可能会比较难,因为它分为了左折叠和右折叠两种。接收的参数有三个,分别是起始值,累加函数,列表。大致的执行过程就是在第一次调用我们的累加函数时将起始值作为一个参数,而列表中的第一个值作为第二个参数去调用我们的累加函数,累加函数计算出结果,而这个结果将作为下一次调用累加函数时的第一参数,而第二个参数则是列表中的下一项,以此类推。所以通过这个高阶函数我们可以直接计算出列表中每项数据累加后的结果,而在FCSLib中的具体实现则如下所示:

通过查看源代码我们也可以得出之前的执行流程,在第一次的时候v的值为startValue,而之后就会将accmulator函数的返回值保存进v,这样下一次执行accmulator时就作为第一个参数传入。下面我们通过一个简单的例子来看看如何使用:

左折叠完成之后对应的还有一个右折叠,当然根据名字也可以猜出。就是从list的末尾开始进行循环,所以我们可以这样来实现FoldR:

这里还要指出的就是左折叠和右折叠是最常用的算法之一,他完全可以实现像我们之前介绍过的Map和Filter,而只要按照下面这种方式写即可:

这里我们就是利用Fold函数的一个特性来实现的,因为累加函数每次都会将上一次计算得出的结果传递给下一个累加函数(new List<R>()我们直接将其作为起始值传入),最后我们都会通过return x将这个列表返回,这样下一次再调用这个累加函数之后x依然是同一个列表。对应的还有Filter的实现:

而具体的调用方式则和Map,Filter是一致的,并没有什么特别大的区别。

关于Linq中的Map、Filter和Fold

其实函数式编程已经在不知不觉中慢慢的进入到我们的生活中,其实我们经常在Linq中使用的selectwhereaggregate就是对应着函数式编程中的map、filter和fold。

C#函数式编程之标准高阶函数的更多相关文章

  1. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  2. Learning Python 012 函数式编程 1 高阶函数

    Python 函数式编程 1 高阶函数 高阶函数 Q:什么是高阶函数? A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数. 简单举个例子: def add(x, y, f): return ...

  3. 小白的Python之路 day3 函数式编程,高阶函数

    函数式编程介绍   函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  4. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

  5. python_08 函数式编程、高阶函数、map、filter、reduce函数、内置函数

    函数式编程 编程方法论: 1.面向过程 找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程 (1).搜索目标,用户输入(配偶要求),按照要求到数据结构内检索合适的任务 (2)表白,表白成功进入 ...

  6. Python3学习之路~3.2 递归、函数式编程、高阶函数、匿名函数、嵌套函数

    1 递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. def calc(n): print(n) if int(n / 2) == 0: return n r ...

  7. python函数式编程之高阶函数学习

    基本概念 函数式编程,是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量.因此,任意一个函数,只要输入确定,输出就确定的这种函数我们称之为纯函数,我们称这种函数没有副作用.而允许使用 ...

  8. Python3基础(3)集合、文件操作、字符转编码、函数、全局/局部变量、递归、函数式编程、高阶函数

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  9. 【python】python函数式编程、高阶函数

    1.map() : python内置的高阶函数,接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并            返回. def f(x): r ...

随机推荐

  1. 使用Autofac在MVC中实现IOC

    var builder = new ContainerBuilder(); //注册DispatchService类型到工厂中 builder.RegisterType<DispatchServ ...

  2. Uiautomator自动编译运行脚本

    Uiautomator的编译运行过程需要输入好几个命令,太麻烦. 花了点时间写了个简单的bat.方便多了.id输入当前使用的SDK ID号(android list target命令可以查看到),cl ...

  3. ssh IP打通,hadoop启动失败

    ssh ip 无密码打通,hadoop启动失败 报错为:host'主机名' can't be established. 纠结了接近一个多小时 之后必须ssh 主机名 , yes一下,发现hadoop能 ...

  4. NO.2

    虚拟语气的终结版.英语语法的终结时刻.迎接新的英语挑战!!!

  5. 64 位 Ubuntu 下 android adb 不可用解决方法

    解决方案: 安装ia32-libs 在终端执行 sudo apt-get install ia32-libs 其间会提示所依赖的某些包不存在,直接 sudo apt-get 安装即可.

  6. nginx伪静态

    nginx 伪静态设置目录  /usr/local/nginx/conf/nginx/conf 1.域名绑定.server_name bbs.99vps.com; 2.网站根目录设置.root /ho ...

  7. Delphi编译的程序,查看控件名称方法

    使用SpyLite24这个软件可以查看程序所使用的控件名称

  8. html 高亮显示表格当前行

    html在线模拟网:http://www.w3school.com.cn/tiy/t.asp?f=html_basic 高亮显示表格当前行 <html> <head> < ...

  9. Xml文件操作的其中一个使用方法:

    XmlNodeList students = doc.DocumentElement.ChildNodes;//Student节点集合 foreach (XmlNode stu in students ...

  10. winform-全局异常捕获作用

    using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;using Jxs ...