开发者社区> zting科技> 正文

函数式编程(2) 高阶函数

简介:
+关注继续查看

  上一篇博客介绍了函数式编程中的基础知识:

1)什么是编程范式;

2)编程函数与数学函数的关系。

  上篇文章介绍了函数式编程属于声明式编程范式中的一种,它仿照数学概念中的公式演算去解决问题,是一种更接近数学语言的编程方式。并且我们知道函数式编程中所有的函数都是“纯函数(Pure Function)”,因为只有纯函数才符合数学中对函数的定义,即:

1)函数均有输入(均带有参数)、均有输出(函数有返回值);

2)使用相同参数调用函数,得到的返回值无论何时均相等(不受其他因素影响)。

  数学函数中包含一类函数叫“高阶函数”,它指“接收一个(多个)函数作为输入,或者返回一个函数”的函数。在函数式编程中,同样存在这样的高阶函数。只要一个函数包含有一个(多个)函数作为参数,或者返回另外一个函数,那么这个函数就称为“高阶函数”。在.NET中我们使用委托来封装方法,这样方法就可以像普通类型一样作为程序之间传递的参数、返回值。在.NET中已经有很多场合使用委托作为函数的参数,比如在异步编程时调用的一些方法均带有AsyncCallback委托类型的参数(BeginInvoke等),尤其是C#3.0出现之后,我们在使用一些类似Select()、Where()等扩展方法时,这些方法均会包含一个委托类型的参数:

复制代码
1 string[] names = { "abc", "def", "ghi", "jkl", "mno" };
2 IEnumerable<string> query = names
3     .Where(n => n.Contains("a"))
4     .OrderBy(n => n.Length)
5     .Select(n => n.ToUpper());
6 foreach (string name in query) Console.WriteLine(name);
复制代码

注意上面代码中使用Lambda表达式就是快速创建委托的一种方式。并且每个委托的签名几乎都一致:包含输入参数,有返回值

  到现在为止,我们很少碰到返回值是委托类型的函数。并不是没有这样的函数,只能说C#在容纳“函数式编程”的程度还不是很够。我们完全可以自己编写一个返回委托类型的“高阶函数”,比如数学中为一个函数求导函数的过程:

复制代码
1 public delegate double Function1X(double x);   //一元函数
2 public Function1X GetDerivative(Function1X func)  //高阶函数,函数作为输入、返回值
3 {
4      double deltaX = 0.00000001;
5      return x => (func(x+deltaX)-func(x))/deltaX;  //导数定义(近似)
6 }
复制代码

如上代码所示,GetDerivative()方法包含一个委托类型参数,代表需要求导函数的函数;并且返回一个委托类型,代表求得的导函数。GetDerivative()方法既包含函数作为参数,又能返回一个函数,因此它属于“高阶函数”。

总结:

1)在编程中,我们可以使用“纯函数”来代表一个数学函数。“纯函数”无副作用(Side-Effect),并且符合数学中对函数的定义。可以这么说,编程函数涵盖的范围包含数学函数;

2)如果一个纯函数的参数又是一个函数,或者该纯函数能够返回另一个函数,那么这个纯函数就称为“高阶函数”,它与数学中的高阶函数对应。

到目前为止,我所讲到的所有内容都是为了让你在“程序”和“数学”之间找到一个共同点,能够一一类比。而这个过程中,“纯函数”无疑是重点。

  下面分享一个demo,能够绘制任意给定函数的曲线图,并能够绘制指定点(X)处的切线。demo中主要演示一个求导函数的高阶函数和一个求切线函数的高阶函数

 View Code

(demo中解析函数表达式的过程使用到了老外的方法,站在巨人肩膀上:))下面是效果图:

源码下载地址:http://files.cnblogs.com/xiaozhi_5638/Functional_Program.rar

 

函数式编程(1)

作者:周见智 
出处:http://www.cnblogs.com/xiaozhi_5638/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

标签: c#函数式编程

本文转自周见智博客博客园博客,原文链接:http://www.cnblogs.com/xiaozhi_5638/p/3952048.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring MVC 函数式编程进阶
1. 前言 上一篇对 Spring MVC 的函数式接口编程进行了简单入门,让很多不知道的同学见识了这种新操作。也有反应这种看起来没有传统写法顺眼,其实大家都一样。但是我们还是要敢于尝试新事物。Java Lambada 刚出来也是被人各种吐槽,现在我在很多项目都见到了它的身影。好了转回正题,本文是对上一篇的延伸,我们继续对 Functional Endpoint 进行一些了解和运用。范式转换其实上一篇已经介绍差不多了,但是一旦你初次接触这种方式往往会面临新的问题。 2. 新的问题 在使用这种风格时我们也会遇到一些新的问题。接下来我们将通过举例来一步步解决这些问题。 2.1 如何异常处理 接
75 0
14.Linux shell编程(函数)
(创建于2018/2/1) 1.简单的一个函数 1 #!/bin/bash 2 3...
771 0
Python函数式编程指南(一):概述
这大概算是Python最难啃的一块骨头吧。在我Python生涯的这一年里,我遇到了一些Pythoner,他们毫无例外地完全不会使用函数式编程(有些人喜欢称为Pythonic),比如,从来不会传递函数,不知道lambda是什么意思,知道列表展开但从来不知道用在哪里,对Python不提供经典for循环感到无所适从,言谈之中表现出对函数式风格的一种抗拒甚至厌恶。
938 0
xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数。 以esp为基址,往后的偏移分别是: 0:函数执行完毕后的返回地址(不是返回值的地址哦) 4:对象实例的指针,即self指针 8:selector,实际是一个...
1033 0
函数分类,HIVE CLI命令,简单函数,聚合函数,集合函数,特殊函数(窗口函数,分析函数,混合函数,UDTF),常用函数Demo
1.1. 函数分类 1.2. HIVE CLI命令 显示当前会话有多少函数可用 SHOW FUNCTIONS; 显示函数的描述信息 DESC FUNCTION concat; 显示函数的扩展描述信息 DESC FUNCTION EXTENDED concat; 1.3. 简单函数 函数的计算粒度为单条记录。 关系运算 数学运算 逻辑运算 数值计算 类型转换 日期函数 条件函数 字
2741 0
python的函数式编程
map #对参数迭代器中的每个元素进行操作,返回一个新的迭代器 map(func, *iterables) --> map object Make an iterator that computes the function using arguments from each of the iterables.
714 0
+关注
3550
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载