何为高阶函数

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

    Python--函数式编程.高阶函数及内置函数 函数式编程 一.不可变数据:不用变量保存状态不修改变量 二.第一类对象:函数即"变量" 1.函数名可以当做参数传递 2.返回值可以是 ...

  2. py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())

    #py函数式编程.py #高阶函数map/reduce/filter/sorted.闭包函数/返回函数.匿名函数lamber.@装饰器decorator.偏函数functool.partial()# ...

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

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

  4. python函数式编程、高阶函数

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

  5. 函数式编程与高阶函数

    初步接触了以下几种高阶函数,还用的不是很熟练. 1.map(): 这个函数接受两个参数: 'map(function, sequence)' 第一个必需参数是一个编辑好的函数,第二个参数是一个序列,m ...

  6. 如何在函数式编程中存在时间函数?

    本文翻译自:How can a time function exist in functional programming? I've to admit that I don't know much ...

  7. 函数式编程中常用的函数(总结)

    一 函数式编程理解 1.函数式编程的含义: 函数式编程是一种编程的基本风格,就是构建程序的结构和元素的方式.函数式编程将计算过程看做是数学函数,也就是可以使用表达式编程.在函数的代码中,函数的返回值只 ...

  8. python采用函数式编程模式吗_Python函数与函数式编程

    1 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创 ...

  9. day16——函数式编程和内置函数

    编程的方法论 面向过程:找到问题的 函数式:不可变.不用变量保存状态.不修改变量 面向对象: 高阶函数: 满足俩个特性任意一个即为高阶函数 1.函数的传入参数是一个函数名 2.函数的返回值是一个函数名 ...

最新文章

  1. 概率论与数理统计--样本及抽样分布
  2. centos6.5下载卸载mysql,centos 6.5卸载Mysql
  3. 华为交换机配置DHCP服务器
  4. JAVA运行时异常及检查式异常
  5. html的id不能有.吗,html – 哪些DOM元素不能接受id?
  6. 如何用法向量求点到平面距离_支持向量机(SVM)
  7. [Ext JS6] Grid不同列的关联编辑
  8. ASP.NET的安全性
  9. #!/bin/sh与#!/bin/bash有区别
  10. JAVA写的模拟收发器设备面板工作状态并输出图形界面
  11. 使用 Auto-TS 自动化时间序列预测
  12. 趋势客户端修改服务器地址,趋势杀毒软件服务器端更改ip
  13. python虚拟变量回归_哑变量 虚拟变量 线性回归_spss 线性回归 哑变量
  14. android 字体外发光,CSS3 霓虹外发光字体效果
  15. 性能魔方七剑下天山之莫问剑:全球首创智能评测
  16. winmerge代码比较器文件夹比较内容
  17. Scratch中的变量
  18. js编写计算圆周长和面积
  19. 钱建林出席西古光通成立30周年庆典
  20. Mac 文件直接被永久删除,而不进垃圾箱 的 解决办法

热门文章

  1. python字符计数怎样去除空格_去除python中的字符串空格的简单方法
  2. 使用Retrofit时,对参数进行加密
  3. LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView
  4. 2021-05-10 linux中的find命令——查找文件名
  5. 描述符:property 迭代器
  6. Javassist 使用指南(一)
  7. Java抽象类与接口的区别
  8. spring里头各种获取ApplicationContext的方法
  9. Latex:表格制作全攻略
  10. Python的单引号、双引号和三引号的字符串