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

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

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


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

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

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

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

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

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

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

更简单的测试和调试。 因为纯函数可以更容易地单独测试,所以您可以编写测试代码来调用具有典型值,有效边缘情况和无效边缘情况的纯函数。

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

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

当你有一组固定的东西时,功能语言是很好的,随着代码的发展,你主要在现有的东西上增加新的操作。 这可以通过添加使用现有数据类型进行计算的新功能来完成,并且现有的功能可以单独使用。

缺点:

这取决于用户的需求选择编程的方式,所以只有当用户不选择正确的方式时才会造成危害。

当进化错误时,你会遇到问题:

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

  • 以下是区别:

    势在必行:

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

  • 把牛奶放入冰箱。
  • 停止。
  • 声明性的,其功能是一个子类别:

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

  • 确保冰箱里有牛奶(当我们需要时 - 用于懒惰的功能语言)。
  • 简介:在命令式语言中,您告诉计算机如何更改内存中的位,字节和单词以及顺序。 在功能方面,我们告诉计算机什么是事情,行动等等。 例如,我们说0的阶乘是1,其他每个自然数的阶乘都是该数字与前一阶乘数的乘积。 我们没有说:要计算n的阶乘,保留一个内存区域并在那里存储1,然后将该内存区域中的数字乘以2到n,并将结果存储在相同的位置,最后,内存区域将包含阶乘。


    函数式编程是“用函数编程”,函数具有一些预期的数学特性,包括参考透明度。 从这些属性中,进一步的属性流动,特别是通过可导致数学证明(即证明结果的可信度)的可替代性所实现的熟悉的推理步骤。

    因此,一个功能程序只是一个表达。

    通过在命令式程序中注意表达式不再是引用透明的地方(因此不用函数和值构建,并且本身不能作为函数的一部分),您可以轻松地看到两种样式之间的对比。 两个最明显的地方是:突变(如变量)其他副作用非局部控制流量(例如,例外)

    在这个由函数和值组成的表达式框架中,构建了语言,概念,“功能模式”,组合器以及各种类型系统和评估算法的完整实用范例。

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

    链接地址: http://www.djcxy.com/p/7433.html

    上一篇: What is difference between functional and imperative programming languages?

    下一篇: What is so special about Monads?