function和命令式编程语言有什么区别?

大多数主stream语言,包括面向对象编程(OOP)语言,例如C#,Visual Basic,C ++和Java,都被devise为主要支持命令式(过程式)编程,而Haskell / gofer式语言则是纯粹的function。 有人可以详细说明这两种编程方式有什么区别吗?

我知道这取决于用户要求select编程的方式,但为什么build议学习函数式编程语言?

定义:命令式语言使用一系列语句来确定如何达到某个目标。 据说这些语句会依次执行每个程序的状态。

例子: Java是一种命令式语言。 例如,可以创build一个程序来添加一系列数字:

int total = 0; int number1 = 5; int number2 = 10; int number3 = 15; total = number1 + number2 + number3; 

每个语句都会改变程序的状态,从将值分配给每个variables到最终添加这些值。 使用五个语句序列明确地告诉程序如何将数字5,10和15加在一起。

function性语言:function性编程范例被明确地创build,以支持解决问题的纯function性方法。 函数式编程是一种声明式编程。

纯函数的优点:将函数转换作为纯函数来实现的主要原因是纯函数是可组合的,即自包含和无状态的。 这些特性带来了许多好处,其中包括:增加了可读性和可维护性。 这是因为每个function都是为了完成一个特定的任务而devise的。 该function不依赖于任何外部状态。

更容易重复的发展。 因为代码更容易重构,所以对devise的更改通常更容易实现。 例如,假设您编写了一个复杂的转换,然后意识到某些代码在转换中会重复多次。 如果你通过纯粹的方法重构,你可以随意调用你的纯方法,而不用担心副作用。

更简单的testing和debugging。 由于纯函数可以更容易地单独进行testing,因此可以编写testing代码来调用具有典型值,有效边缘情况和无效边缘情况的纯函数。

对于面向对象的人或命令式语言:

面向对象的语言是很好的,当你有一套固定的操作时,随着你的代码的发展,你主要增加新的东西。 这可以通过添加实现现有方法的新类来完成,并且将现有的类单独放置。

当你有一组固定的东西时,函数式语言是很好的,随着代码的发展,你主要在现有的东西上添加新的操作。 这可以通过添加使用现有数据types进行计算的新function来完成,而现有的function则是独立的。

缺点:

这取决于用户的要求select编程的方式,所以只有在用户不select正确的方式时才有危害。

当进化错误的时候,你有问题:

  • 将一个新的操作添加到面向对象的程序中可能需要编辑许多类定义来添加一个新的方法
  • 为function程序添加新的function可能需要编辑许多function定义来添加新的function。

以下是区别:

势在必行:

  • 开始
  • 打开你的鞋大小9 1/2。
  • 在你的口袋里留出空间来保存一个键[7]。
  • 把钥匙放在房间里,钥匙放在口袋里。
  • 进入车库。
  • 打开车库。
  • 进入汽车。

…等等,然后…

  • 把牛奶放在冰箱里。
  • 停止。

声明性的,其function是一个子类别:

  • 牛奶是一种健康的饮料,除非你有消化乳糖的问题。
  • 通常情况下,一个人在冰箱里储存牛奶。
  • 冰箱是一个让东西保持凉爽的盒子。
  • 商店是销售商品的地方。
  • 通过“销售”,我们指的是货币交换。
  • 另外,货币交换被称为“购买”。

…等等,然后…

  • 确保我们在冰箱里有牛奶(当我们需要时 – 用于懒惰的function语言)。

简介:在命令式语言中,你告诉计算机如何改变内存中的位,字节和单词以及按照什么顺序。 在function方面,我们告诉计算机什么东西,行动等等。 例如,我们说0的阶乘是1,其他每个自然数的阶乘都是这个数的乘积和它的前辈的阶乘。 我们并不是说:为了计算n的阶乘,保留一个内存区域并在那里存储1,然后将该内存区域中的数字乘以2到n,并将结果存储在相同的地方,最后,内存区域将包含阶乘。

函数式编程是“用函数编程”,函数具有一些预期的math特性,包括参考透明性。 从这些属性中,进一步的属性stream动,特别是由可替代性引起的熟悉的推理步骤导致mathcertificate(即certificate结果的可信度)。

因此,function程序只是一个expression。

你可以很容易地看到这两种风格之间的对比,注意到一个命令式程序中的一个expression式不再是透明的(因此不是由函数和值构build的,本身不能作为函数的一部分)。 两个最明显的地方是:突变(如variables)其他副作用非局部控制stream(例如exception)

在这个由function和价值组成的expression式框架中,构build了语言,概念,“function模式”,组合器以及各种types的系统和评估algorithm的整个实践范例。

根据最极端的定义,几乎任何语言(甚至C或Java)都可以称为function性的,但是通常人们对具有特定相关抽象的语言(例如闭包,不可变值和语法辅助如模式匹配)保留术语。 就使用函数式编程而言,它涉及到函数的使用和构build代码而没有任何副作用。 用来写certificate