目录介绍函数编程定义函数属性纯度头等函数闭包的概念成为函数式函数式实用程序纯度重要性头等的重要性函数编程和面向对象编程集成函数编程总结下载源码 - 7.9 KB介绍如今函数性编程正在流行。我们应该问自己有两个问题为什么这种变化发生在程序员和语言创造者身上以及如何证明这一点有很多函数语言CC Java。LispJavaScriptPythonSmalltalkRubyOCamlFScalaGroovyDErlangClojureGoSwift等。我们还可以注意到有很多关于函数式编程的书籍还有另外两个重要问题如何定义一种函数语言什么是函数式编程函数编程定义函数式编程是基于函数它们的组合以及也基于函数分解的编程。组合/分解的这种影响是编程范例的标志一种建模和构建解决方案的方式。作为例子引用的所有语言都具有函数概念。函数式编程包括使用具有特定属性的函数。函数属性函数有两种可能的属性纯度函数的结果取决于它们的参数而没有任何其他外部影响。头等函数具有值的状态。函数编程包括利用这些属性中的一个或两个。函数式语言是一种让函数式编程更具优势的语言。纯度如果函数是纯函数则意味着它将生成仅依赖于函数的参数而没有任何其他外部影响的结果。函数纯度拒绝副作用和状态。倡导数据结构的不变性。例如下面是一个纯函数int f(int i){ return i 4; } f(1); // - 5 f(1); // - 5以下是一个不纯的函数int j 4; int g(int i){ j i j; return j; } g(1); // - 5 g(1); // - 6作为其他示例Log是纯函数。Random是一个不纯的函数。头等函数要成为头等函数意味着函数具有与诸如整数或字符之类的值相同的状态函数可以被命名、影响和类型化。可以根据需要定义和创建函数。函数可以作为另一个函数的参数传递。可以从另一个函数返回一个函数。函数可以存储在数据结构中。下面是一些例子1.被命名、影响和类型化的能力Funcdouble, double f Math.Sin;2.按需定义和创建的能力Funcint, int f x x 1;3.作为参数传递给函数的能力g(f, 1, 2);其中g定义如下double g(Funcdouble, double f, double x, double d){ return f(x) d; }4.作为函数结果的能力Funcdouble, double f g(10);其中g定义如下Funcdouble, double g(double x){ return y x y; }5.能够存储在数据结构中例如列表var l new ListFuncdouble, double { Math.Sin, Math.Cos, Math.Tan };此外C允许将lambda表达式表示为称为表达式树的数据结构ExpressionFuncint, int expression x x 1; var d expression.Compile(); d.Invoke(2);因此它们可以被存储和传输。闭包的概念闭包和头等是两个独立的属性。但是要成为纯粹和/或头等必须将函数转换为闭包。例如当我们将以下函数关联到以下环境时以下函数将转换为其他上下文中的纯函数int i 0, j 1; int f(int k){ return k i j; }函数式语言的标志是自动将函数的定义转换为闭包。成为函数式以前的定义表明纯度是编写函数的一门学科。为了提高函数状态不必全部实现头等的五个特征。函数语言不需要专门使用。纯度和头等可以在最初没有的语言中受到青睐。函数式实用程序在开发和项目方面纯度和头等函数的实际后果是什么纯度重要性纯度引发以下主要特征与函数的应用程序上下文无关。每当子表达式被赋值时每个子表达式都可以被赋值。这意味着函数组合的稳定性。以下是纯度的重要性函数概念简化了手续。更完整和更具代表性的函数行为类型。自然并行化。提高了可读性和可维护性。简单的测试。记住值缓存。控制评估。然而纯度使一些事情变得复杂数据结构的管理。显式内存管理。输入/输出的定义和错误处理只能使用纯函数进行编码。Haskell是一种强加于此的语言。C允许注释函数以明确指示它们是纯的[Pure] bool f(int i){ return i 4 0; } Contract.Requires(f(0));在C的官方文档中“锲约中调用的所有方法都必须是纯粹的;换句话说它们不能更新预先存在的状态。”头等的重要性头等的函数是可以被命名、影响和类型化的。可以按需定义和创建。可以作为参数传递给函数。可以是函数的结果。可以存储在数据结构中。如果函数可以作为参数传递给函数那么它将意味着泛化/函数抽象的可能性。函数中代码的每个部分都可以用抽象函数调用代替。一个简单的代码float M(int y){ int x1 [ ... ]; int x2 [ ... ]; [ ... ] [ ... some code ... ]; // some code using x1, x2 and y [ ... ] }函数抽象public delegate int Fun(int x, int y, int z); float MFun(Fun f, int x2, int y){ int x1 [ ... ]; [ ... ] f(x1, x2, y); [ ... ] } int z1 MFun(F1, 1, 2); int z2 MFun(F2, 1, 2);函数抽象的优点是没有局部重复并且存在关注点分离。函数抽象的简单有效应用是对数据的通用高阶迭代操作。例如内部迭代器MapsIEnumerableT2 MapT1, T2(this IEnumerableT1 data, FuncT1, T2 f){ foreach(var x in data) yield return f(x); } someList.Map(i i * i);作为头等的另一个结果我们对泛型函数类型进行了定义。C为arity提供函数和程序通用委托预定义类型最多16个delegate TResult FuncTResult (); delegate TResult FuncT, TResult(T a1); delegate TResult FuncT1, T2, TResult(T1 a1, T2 a2); delegate void ActionT(T a1); [ ... ]通过推理类型可以减轻头等的函数。C提供了var关键字但它对于函数类型来说太弱了。要按需定义和创建通过匿名函数完成也称为lambdasdelegate(string s) { return s some string; };匿名委托看起来更像lambda表达式(s { return s some string; }); s s some string;一个主要的例子是对数据结构的迭代处理的推广它有三种类型的函数mapreduce / folds和filters。例如内部迭代器MapsIEnumerableT2 MapT1, T2(this IEnumerableT1 data, FuncT1, T2 f){ foreach (var x in data) yield return f(x); } someList.Map(i i * i);大多数函数式语言在其库中提供映射/简化/过滤器在C中是Select/Aggregate/Where。映射/简化/过滤器函数集也用于表示治疗的组成例如LINQvar q programmers .Where(p p.Age 20) .OrderByDescending(p p.Age) .GroupBy(p p.Language) .Select(g new{ Language g.Key, Size g.Count(), Names g });作为函数的结果允许适应函数。部分申请currying。使用头等函数每个n元函数都可以转换为n个一元函数的组合即成为一个curried函数Funcint, int, int lam1 (x, y) x y; Funcint, Funcint, int lam2 x (y x y); Funcint, int lam3 lam2(3); // partial applicationCurryingpublic static FuncT1, FuncT2, TRes CurryT1, T2, TRes(this FuncT1, T2, TRes f){ return (x (y f(x, y))); } Funcint, int lam4 lam1.Curry()(3); // partial application要存储在数据结构中允许动态模块化管理函数集结构化列表表格树图等。将参数作为函数集而不是简单函数传递。此外其中一个缺点是数据驱动编程。一些函数式编程技术使用纯度和头等MapreduceC中的SelectAggregate广义迭代处理纯函数便于并行化。通过函数仿真控制评估封装在没有参数的函数中的纯表达式这些函数的按需逐个调用评估。函数编程和面向对象编程为什么函数式编程通常集成到面向对象的编程中主要的面向对象编程语言基于类作为模块CC Java。面向对象编程中开发的强大思想之一维护、扩展和适应操作可以通过继承和类组合这避免了对现有代码的任何修改。函数式编程是这个问题的解决方案。例如战略设计模式。策略模式是让算法独立于使用它的客户端而变化策略只是在方法级别抽象代码的情况不需要面向对象的封装和新的类层次结构。例如在.NET Framework中public delegate int ComparisonT(T x, T y); public void Sort(ComparisonT comparison); public delegate bool PredicateT(T obj); public ListT FindAll(PredicateT match);其他设计模式如命令观察者访问者和虚拟代理可以使头等的函数受益集成函数编程包含头等函数的语言应该促进函数编程并促进它。总结函数编程有利于开发纯度和头等产生一定程度的稳定性、确定性、可测试性、分区、使用流动性、组合性、概括性、可扩展性等。函数式编程适用于模块化对象。函数式编程是可溶的纯度和头等函数可以用任何语言来考虑包含和促进。函数/方法级别的代码抽象。方便的通用迭代器/循环实现。操作组合序列/查询理解。函数部分应用。对象/类定义数量的限制。在函数/方法级别命名抽象。架构简化。增加灵活性。
郑州网站建设
网页设计
企业官网