函数式编程语言

函数式编程语言是一种便于使用函数式编程范式的语言,一句话,如果你有函数编程所需的特性,它可以称为功能语言。在大多数情况下,编程风格实际上决定程序是否功能。

什么使语言具有功能特性

函数式编程不能用C语言实现的。功能规划不能用java实现的(不包括近似函数式编程的,是由很多变量的方式实现),这些语言不包含支持函数式编程结构。他们是纯粹的面向对象,严格非功能性语言。

同时,纯函数式语言不能使用面向对象的编程,如方案,Haskell和Lisp。

然而,有些语言是由两个模型支持的,Python是一个著名的例子,但还有其他的东西:露比、朱丽亚和我们最感兴趣的Javascript。这些语言是如何支持这两种不同的设计模式的呢它们包含两种编程范式所需的特性。然而,对于Javascript,函数的特性似乎是隐藏的。

但事实上,功能语言需要的不仅仅是上述功能语言的特性是什么呢





特征
命令
函数公式


编程风格
一步一步地管理国家的变化
描述问题并更改所需数据以解决问题


状态的变化
非常重要
不存在


执行顺序
非常重要
不是很重要


主要控制流程
循环、条件、函数调用
函数调用与递归


主要经营单位
结构和类对象
作为一类公民的对象和数据集的功能





函数式语言的语法必须考虑到具体的设计模式,如类型推理系统和匿名函数,一般来说,语言必须实现lambda演算,而解释器的评价策略必须称为非严格和按需。它允许不断的数据结构和非严格的惰性评估。


这段使用一些功能编程词汇。lambda演算是一个正式的功能演绎系统(听起来很晕),其前提是内部函数和匿名函数。非严格的评估和对意义的懒惰的评价,不是严格与所有元素的操作规则,按照重新计算,但根据对最终需求只计算部分的有用,比如我们要把一百的第一要素三数组,唯一真正的惰性求值计算三个元素是数组的数组,而不是计算的一百要素。




优势

当你完成函数式编程时,它会给你很大的启发。这种经历会使程序员的职业生涯在你后面增加一点,你是否真的会成为一个全职的函数程序员。

但现在我们不是在讨论如何学习冥想。我们正在探索如何学习一个有用的工具,这将使你成为一个更好的程序员。

一般来说,使用函数式编程的真正优势是什么

更简洁的代码

函数式编程更简单、更简单、更简单,简化了调试、测试和维护。

例如,我们需要一个可以将二维数组转换成一维数组的函数:




功能merge2darrayintoone(阵列){
VaR计算= arrays.length;
var合并=新数组(计数);
var=0;
对于(var i = 0;i <计数;+ i i){
对于(var j = 0,jlen =数组{我}。长度;J < jlen;+ + J){
合并{ C++ } = {我} { }阵列{J}.;
}
}
返回合并
}



现在使用函数技术,可以编写如下:




merge2darrayintoone2 =(阵列)->
Arrays.reduce(备忘录,项目)->
memo.concat项目
{ }。




无功merge2darrayintoone2 =函数(数组){
返回arrays.reduce(函数(p,n){
返回p.concat(N);
},{ });
};





原来的代码是错误的,当函数被调用时,第二个参数空数组丢失。这里已经加了。




这两个函数具有相同的输入和返回相同的输出,但是函数公式的例子更简洁。

模块化

函数式编程迫使大型问题分解成更小的情况,解决相同的问题,这意味着代码将更模块化。模块化程序有更清晰的描述,更易于调试,更易于维护。

可重用性

由于它的模块化特性,函数式编程有许多一般的辅助函数。

在后面的章节中,将介绍许多最常见的函数。然而,作为一个函数程序员,您不可避免地会编写一个函数库,这些函数库将被一次又一次地使用。

降低耦合

耦合是程序中各模块之间的大量依赖关系,因为函数规划遵循一级的高阶纯函数,使它们独立于全局变量,完全独立于其他变量。当然,函数的相互依赖性是不可避免的,但是只要一对一的输入和输出映射正确,改变一个函数就不会影响其他功能。

数学的正确性

最后一点是理论上的,由于lambda演算,函数规划可以证明数学的正确性,这对于一些研究者来说是一个很大的优势,他们需要用程序来证明增长率、时间复杂度和数学正确性。

我们看斐波那契数列,虽然它很少用于概念证明以外的问题,但是用它来解释这个概念是很好的:




斐波那奇(n)=斐波那奇(n-2)+斐波那奇(n - 1)



还需要添加一般情况:




当n<2时返回1



这使得递归终止并允许递归调用堆栈中的每一步从这里累积。

下面列出了详细步骤




函数(n){
如果(n<2){
返回1;
{ }人
返回斐波那契(n - 2)+斐波那契(n - 1);
}
}
console.log(斐波那契(8));
34 输出:



然而,在一个懒惰的执行函数库的帮助下,可以生成一个无限大的序列,它用数学公式来定义整个序列的成员。




无功fibonacci2 = lazy.generate(function()){
变量x=1,
y=1;
返回函数(){
变量prev = x;
x=y;
Y =沪指;
回沪指;
};
}();
console.log(fibonacci2.length());
输出:未定义
console.log(fibonacci2.take(12)。ToArray());
/ /输出:{ 1, 1, 2,3,8,13, 21, 34,55, 89, 144 }
无功fibonacci3 = lazy.generate(function()){
变量x=1,
y=1;
返回函数(){
变量prev = x;
x=y;
Y =沪指;
回沪指;
};
}();
console.log(fibonacci3.take(9)。反()。第一(1),ToArray());
输出:{ 34 }



第二个例子显然更数学。它依赖于lazy.js函数库。还有其他如库,如sloth.js和wu.js,这将在第三章讨论。

让我插几句:下面的例子懒执行似乎只是展现数学正确性的函数式编程的性能,作者必须具有相同的内部函数两次写懒惰的负荷是更令人惊讶的,完全没有意义…我想你知道这是线路上的懒惰,做没有深究。

非功能世界中的函数编程

功能性和非功能性编程能混合在一起吗虽然这是第七章的主题,但在我们进一步学习之前,我们还得弄清楚一些东西。

这本书不想教你如何使用纯函数编程来实现整个应用程序,这种应用程序不太适合学术界,另一方面,这本书是一种设计策略,教你如何在必要的命令代码上使用纯函数。

例如,你需要在文本中找到只有四个字母的单词。




var =单词,计数= 0;
文本= mystring.split('');
为(i = 0;计数<4,我的<< text.length;i++){
如果(!文本{我}。比赛( / / } { 0-9)){
词= words.concat(文本{我});
计数+ +;
}
}
Console.log(字);



函数式编程将像这样编写。




var;
VaR的话= mystring.split('')。滤波器(函数(x){)
返回(!x.match( / { 1-9 } + /));
})片(0,4);
Console.log(字);



如果有一个函数式编程工具库,代码可以进一步简化:

复制代码代码如下所示:

VaR的话=排序(mystring)。比赛( / { a-za-z } + /)第一(4);



判断一个函数是否可以以一种更有效的方式来写,是寻找一个循环和一个临时变量,例如前一个例子中的单词和计数变量,我们通常可以用高阶函数代替循环和临时变量,本章后面部分将继续探讨它。

Javascript是一种函数式编程语言吗

现在有最后一个问题,我们需要问自己,Javascript是一种功能语言还是一种非功能语言

Javascript可以说是最流行和最未知的世界中的函数式编程语言,Javascript是一种功能性编程语言,穿C的外套。它更像是一个语法和C,这意味着它使用C语言的语法和中缀顺序。它是在现有的语言最糟糕的名字。你可以看到有多少人会用javascript和java的关系感到困惑,没有思考它,就像它的名字所暗示的将会是什么。但事实上,它已经在共同与java很小。但仍有给力到Javascript的面向对象语言的一些想法。例如,Dojo和ease.js图书馆已经做了大量的工作,试图抽象的Javascript使其适合于面向对象编程,Javascript来自时代的面向对象时代世界各地的年代。我们被告知,Javascript是一种面向对象的语言,因为我们希望它是这样的,但其实它不是。

其真实身份可以追溯到它的原型:方案和Lisp,两个典型的函数式编程语言,Javascript一直都是一个功能的编程语言,它的功能是一流的公民,并可以嵌套,它有一个封闭的复合函数,使理化和单子。所有这一切都是函数式编程的关键。也有一些为什么Javascript是一种功能性语言的原因。



Javascript的词汇包括将函数传递为参数、用类型推断系统支持匿名函数、高阶函数、闭包等功能,这些特性对于函数式编程的结构和行为是至关重要的。



Javascript不是纯粹的面向对象语言。大多数面向对象的设计模式都是通过复制原型对象完成的。这是一个弱的面向对象的编程模型。欧洲计算机制造商协会(ECMA脚本),正式形成和Javascript的标准实现,具有以下的4.2.1版本的说明书:

Javascript没有真正的类像C++,Smalltalk和java,但是它支持创建该对象的构造函数。一般来说,在一个类的对象导向语言,国家通过实例加载的方法是通过加载类,并继承是唯一的结构和行为。在EMACscript,国家和法的对象,和结构,行为,和国家的继承。

Javascript是一种解释语言,Javascript解释器(有时称为引擎)与方案解释器非常相似,它们都是动态的,具有灵活的数据类型,易于组合和传输。它们都将代码视为表达式块,而处理函数的方式类似。

换句话说,Javascript不是一个纯粹的功能性的语言。它缺乏懒惰的评价和建立在不可改变的数据。这是因为大多数的翻译都叫名字,不需求。Javascript不是很善于处理递归由于其尾部调用。但所有的这些问题都可以通过小注意减轻。无限序列的非严格求值和惰性的评价可以通过图书馆称为lazy.js.the非变量只需要通过简单的编程技巧实现的实现,但它不是由语言水平有限,但要求程序员的self-discipline.the尾递归消除可以通过一种称为蹦床实现。这些问题可以解释的第六章。

关于Javascript是一种函数式语言或面向对象语言,或者两者都有,或者两个参数都不多,但是这些参数将继续下去。

最后,函数编程是通过巧妙地改变、组合和使用函数来编写简洁代码的方法,而Javascript提供了一种实现这些功能的好方法。