上一篇博客介绍了函数式编程中的基础知识:
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
相关推荐
例如,高阶函数(接受函数作为参数或返回函数的函数)允许对函数进行操作和组合,而λ函数(匿名函数)则提供了一种简洁的定义小功能的方式。 在函数式编程中,数据结构和算法也扮演着重要角色。例如,列表推导式...
Java函数式编程是一种编程范式,它强调使用函数作为程序的基本构建块,将计算视为函数的组合,并且尽可能避免改变状态和可变数据。在Java 8及更高版本中,函数式编程得到了官方的大力支持,引入了Lambda表达式、...
函数式编程强调使用纯函数、避免副作用、函数的不可变性以及利用高阶函数等概念。通过阅读《JavaScript函数式编程指南》,读者可以了解到函数式编程的基本概念和实现技巧,并且会发现JavaScript作为函数式编程语言的...
高阶函数是函数式编程的基石之一,第5章深入讲解了`map()`、`filter()`等经典函数,以及如何创建自定义的高阶函数。递归和归约是函数式编程中的核心概念,第6章详细介绍了如何使用递归来设计算法,以及如何通过归约...
Python 函数式编程和高阶函数 01高阶函数概念.mp4
这些库提供了大量的函数式编程工具函数,如辅助实现高阶函数、数据转换、集合操作等,极大地简化了在JavaScript中进行函数式编程的过程。 以上是对“JavaScript函数式编程”可能包含的知识点的一个大致介绍。考虑到...
Java函数式编程是一种将函数作为一等公民的编程范式,它强调使用函数来构造程序,减少副作用,提高代码的可读性和可维护性。在Java 8及更高版本中,函数式编程得到了显著增强,引入了Lambda表达式、函数接口、Stream...
这为在C++中实现更高层次的函数式编程概念(如高阶函数)提供了基础。 #### 示例:使用纯函数改进代码 考虑一个简单的例子,假设有一个函数需要根据输入的数字列表计算平均值。传统的方法可能会直接在函数内部修改...
Python 函数式编程和高阶函数 05高阶函数sorted的使用.mp4
Python 函数式编程和高阶函数 02高阶函数map的使用.mp4
Python 函数式编程和高阶函数 04高阶函数filter的使用.mp4
Python 函数式编程和高阶函数 03高阶函数reduce的使用.mp4
Python 函数式编程和高阶函数 06匿名函数.mp4
Python 函数式编程和高阶函数 14偏函数.mp4
* 高阶函数:函数式编程可以将函数作为参数传递给其他函数,或者将函数作为返回值返回。 Lambda 表达式: Lambda 表达式是函数式编程的核心,它由箭头 -> 分隔开参数和函数体,箭头左边是参数,右边是 lambda 返回...
开发者可以利用这种特性编写高阶函数,也就是可以接受其他函数作为参数或将函数作为结果返回的函数。这为代码复用和抽象提供了强大的工具。 纯函数的概念是指一个函数的输出仅仅依赖于输入的参数,而不依赖于外部...
函数式编程的核心概念包括了纯函数、不可变数据和函数的高阶使用。纯函数指的是那些没有副作用、相同的输入总会得到相同输出的函数。不可变数据保证了数据状态在程序运行中不会改变,这在并行计算和多线程环境下非常...
Python 函数式编程和高阶函数 13通用装饰器.mp4
本指南将深入探讨JavaScript的高效编程和函数式编程这两个重要主题,帮助开发者提升技能,实现更优雅、更可维护的代码。 《Effective JavaScript(中文版).pdf》这本书是JavaScript编程的经典之作,它包含了68个具体...