上一篇博客介绍了函数式编程中的基础知识:
1)什么是编程范式;
2)编程函数与数学函数的关系。
上篇文章介绍了函数式编程属于声明式编程范式中的一种,它仿照数学概念中的公式演算去解决问题,是一种更接近数学语言的编程方式。并且我们知道函数式编程中所有的函数都是“纯函数(Pure Function)”,因为只有纯函数才符合数学中对函数的定义,即:
1)函数均有输入(均带有参数)、均有输出(函数有返回值);
2)使用相同参数调用函数,得到的返回值无论何时均相等(不受其他因素影响)。
数学函数中包含一类函数叫“高阶函数”,它指“接收一个(多个)函数作为输入,或者返回一个函数”的函数。在函数式编程中,同样存在这样的高阶函数。只要一个函数包含有一个(多个)函数作为参数,或者返回另外一个函数,那么这个函数就称为“高阶函数”。在.NET中我们使用委托来封装方法,这样方法就可以像普通类型一样作为程序之间传递的参数、返回值。在.NET中已经有很多场合使用委托作为函数的参数,比如在异步编程时调用的一些方法均带有AsyncCallback委托类型的参数(BeginInvoke等),尤其是C#3.0出现之后,我们在使用一些类似Select()、Where()等扩展方法时,这些方法均会包含一个委托类型的参数:
string[] names = { "abc", "def", "ghi", "jkl", "mno" }; IEnumerable<string> query = names .Where(n => n.Contains("a")) .OrderBy(n => n.Length) .Select(n => n.ToUpper()); foreach (string name in query) Console.WriteLine(name);
注意上面代码中使用Lambda表达式就是快速创建委托的一种方式。并且每个委托的签名几乎都一致:包含输入参数,有返回值。
到现在为止,我们很少碰到返回值是委托类型的函数。并不是没有这样的函数,只能说C#在容纳“函数式编程”的程度还不是很够。我们完全可以自己编写一个返回委托类型的“高阶函数”,比如数学中为一个函数求导函数的过程:
public delegate double Function1X(double x); //一元函数 public Function1X GetDerivative(Function1X func) //高阶函数,函数作为输入、返回值 { double deltaX = 0.00000001; return x => (func(x+deltaX)-func(x))/deltaX; //导数定义(近似) }
如上代码所示,GetDerivative()方法包含一个委托类型参数,代表需要求导函数的函数;并且返回一个委托类型,代表求得的导函数。GetDerivative()方法既包含函数作为参数,又能返回一个函数,因此它属于“高阶函数”。
总结:
1)在编程中,我们可以使用“纯函数”来代表一个数学函数。“纯函数”无副作用(Side-Effect),并且符合数学中对函数的定义。可以这么说,编程函数涵盖的范围包含数学函数;
2)如果一个纯函数的参数又是一个函数,或者该纯函数能够返回另一个函数,那么这个纯函数就称为“高阶函数”,它与数学中的高阶函数对应。
到目前为止,我所讲到的所有内容都是为了让你在“程序”和“数学”之间找到一个共同点,能够一一类比。而这个过程中,“纯函数”无疑是重点。
文章摘自:http://blog.csdn.net/VonSdite/article/details/76796595
相关推荐
Python 函数式编程和高阶函数 01高阶函数概念.mp4
Python 函数式编程和高阶函数 02高阶函数map的使用.mp4
Python 函数式编程和高阶函数 05高阶函数sorted的使用.mp4
Python 函数式编程和高阶函数 04高阶函数filter的使用.mp4
Python 函数式编程和高阶函数 03高阶函数reduce的使用.mp4
Python 函数式编程和高阶函数 14偏函数.mp4
Python 函数式编程和高阶函数 06匿名函数.mp4
Python 函数式编程和高阶函数 13通用装饰器.mp4
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有 变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为 没有副作用。而允许使用变量的程序设计语言...
Python 函数式编程和高阶函数 09闭包的特殊用途.mp4
Python 函数式编程和高阶函数 07闭包定义及使用.mp4
Python 函数式编程和高阶函数 10装饰器的基本使用.mp4
Python 函数式编程和高阶函数 12带参数的装饰器.mp4
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有 变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为 没有副作用。而允许使用变量的程序设计语言...
Python 函数式编程和高阶函数 11多个装饰器的使用.mp4
尽管函数式编程在近十多年用得越来越多,但市面上介绍其高阶特性的书却并不多。这本书在这方面是个重要的补充,它不仅仅面向 Scala 程序员,同样面向用任何编程语言开发的程序员,只要你充满好奇心。 ——挖财网...
你将学习柯里化、偏函数、高阶函数以及Monad等概念。 目前,编程语言已经将焦点从对象转移到函数。JavaScript支持函数式编程,并允许开发者编写精心设计的代码。 主要内容 ●掌握函数式编程的概念 ●...
Python 函数式编程和高阶函数 08使用闭包求两点之间的距离.mp4
全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...
全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...