只要我们的函数的参数能够接收函数

时间:2022-03-31 07:42:10

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


Map

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

只要我们的函数的参数能够接收函数

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

只要我们的函数的参数能够接收函数

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


Filter

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

只要我们的函数的参数能够接收函数

这里我们只是少了一个泛型参数,对应的第一参数的是能够接收T类型返回bool类型的函数(


Predicate


也是.NET自带的,可能我们用惯了


Func





Action


,并且操作


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