当前位置: 首页 > 编程笔记 >

C#中的高阶函数介绍

暨正真
2023-03-14
本文向大家介绍C#中的高阶函数介绍,包括了C#中的高阶函数介绍的使用技巧和注意事项,需要的朋友参考一下

介绍

我们都知道函数是程序中的基本模块,代码段。那高阶函数呢?听起来很好理解吧,就是函数的高阶(级)版本。它怎么高阶了呢?我们来看下它的基本定义:
1:函数自身接受一个或多个函数作为输入
2:函数自身能输出一个函数。  //函数生产函数
 
满足其中一个就可以称为高阶函数。高阶函数在函数式编程中大量应用。c#在3.0推出Lambda表达式后,也开始慢慢使用了。
 
目录
1:接受函数
2:输出函数
3:Currying(科里化)

一、接受函数

为了方便理解,都用了自定义。

代码中TakeWhileSelf 能接受一个函数,可称为高阶函数。


//自定义委托

    public delegate TResult Function<in T, out TResult>(T arg);

    //定义扩展方法     public static class ExtensionByIEnumerable     {         public static IEnumerable<TSource> TakeWhileSelf<TSource>(this IEnumerable<TSource> source, Function<TSource, bool> predicate)         {             foreach (TSource iteratorVariable0 in source)             {                 if (!predicate(iteratorVariable0))                 {                     break;                 }                 yield return iteratorVariable0;             }         }     }     class Program     {         //定义个委托

        static void Main(string[] args)         {             List<int> myAry = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

            Function<int, bool> predicate = (num) => num < 4;  //定义一个函数

            IEnumerable<int> q2 = myAry.TakeWhileSelf(predicate);  //

            foreach (var item in q2)             {                 Console.WriteLine(item);             }             /*              * output:              * 1              * 2              * 3              */         }     }

二、输出函数

代码中OutPutMehtod函数输出一个函数,供调用。


var t = OutPutMehtod();  //输出函数

            bool result = t(1);

            /*              * output:              * true              */

  static Function<int, bool> OutPutMehtod()         {             Function<int, bool> predicate = (num) => num < 4;  //定义一个函数

            return predicate;         }

三、Currying(科里化)

一位数理逻辑学家(Haskell Curry)推出的,连Haskell语言也是由他命名的。然后根据姓氏命名Currying这个概念了。

上面例子是一元函数f(x)=y 的例子。

那Currying如何进行的呢? 这里引下园子兄弟的片段。

假设有如下函数:f(x, y, z) = x / y +z. 要求f(4,2, 1)的值。

首先,用4替换f(x, y, z)中的x,得到新的函数g(y, z) = f(4, y, z) = 4 / y + z

然后,用2替换g(y, z)中的参数y,得到h(z) = g(2, z) = 4/2 + z

最后,用1替换掉h(z)中的z,得到h(1) = g(2, 1) = f(4, 2, 1) = 4/2 + 1 = 3

         很显然,如果是一个n元函数求值,这样的替换会发生n次,注意,这里的每次替换都是顺序发生的,这和我们在做数学时上直接将4,2,1带入x / y + z求解不一样。

        在这个顺序执行的替换过程中,每一步代入一个参数,每一步都有新的一元函数诞生,最后形成一个嵌套的一元函数链。

        于是,通过Currying,我们可以对任何一个多元函数进行化简,使之能够进行Lambda演算。

         用C#来演绎上述Currying的例子就是:


var fun=Currying();

Console.WriteLine(fun(6)(2)(1));

/*

* output:

* 4

*/

 

static Function<int, Function<int, Function<int, int>>> Currying()

  {

     return x => y => z => x / y + z;

 }

 类似资料:
  • 本文向大家介绍Javascript中的高阶函数介绍,包括了Javascript中的高阶函数介绍的使用技巧和注意事项,需要的朋友参考一下 这是一个有趣的东西,这或许也在说明Javascript对象的强大。我们要做的就是在上一篇说到的那样,输出一个Hello,World,而输入的东西是print('Hello')('World'),而这就是所谓的高阶函数。 高阶函数 高阶看上去就像是一种先进的编程技术

  • Haskell 中的函数可以接受函数作为参数也可以返回函数作为结果,这样的函数就被称作高阶函数。高阶函数可不只是某简单特性而已,它贯穿于 Haskell 的方方面面。要拒绝循环与状态的改变而通过定义问题"是什么"来解决问题,高阶函数必不可少。它们是编码的得力工具。 Curried functions 本质上,Haskell 的所有函数都只有一个参数,那么我们先前编那么多含有多个参数的函数又是怎么回

  • 简介 高阶函数(Higher Order Function)是一种以函数为参数的函数。它们都被用于映射(mapping)、过滤(filtering)、归档(folding)和排序(sorting)表。高阶函数提高了程序的模块性。编写对各种情况都适用的高阶函数与为单一情况编写递归函数相比,可以使程序更具可读性。比如说,使用一个高阶函数来实现排序可以使得我们使用不同的条件来排序,这就将排序条件和排序过

  • 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 一个最简单的高阶函数: function add(x, y, f) { return f(x) + f(y); } 当我们调用add(-5, 6, M

  • 高阶函数英文叫Higher-order function。什么是高阶函数?我们以实际代码为例子,一步一步深入概念。 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但是,如果只写abs呢? >>> abs <built-in function abs> 可见,abs(-10)是函数调用,而abs是函数本身。 要获得函数

  • 高阶函数英文叫Higher-order function。什么是高阶函数?我们以实际代码为例子,一步一步深入概念。 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但是,如果只写abs呢? >>> abs <built-in function abs> 可见,abs(-10)是函数调用,而abs是函数本身。 要获得函数