函数式编程与声明性编程和命令式编程

lak*_*esh 32 terminology

我已经习惯了命令式编程,这是告诉计算机逐步执行程序以获得最终结果的常用方法.另一方面,声明性编程只是传递输入并期望输出而不说明过程如何完成.我很困惑的是功能编程.我知道函数式编程是一种编程范式,它将计算视为数学函数的评估,避免使用状态和可变数据,而不是一种声明性语言.但是,我仍然不能理解它是如何工作的.

我们举一个执行Fibonacci数的例子.

命令式编程:

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
  int n,i,c,a=0,b=1; 
  printf("Enter Fibonacci series of nth term : "); 
  scanf("%d",&n); 
  printf("%d %d ",a,b); 
  for(i=0;i<=(n-3);i++) 
  { 
    c=a+b; 
    a=b; 
    b=c;    
  } 
  printf("%d ",c);
  getch(); 
} 
Run Code Online (Sandbox Code Playgroud)

声明性编程:

Give the nth number and it will return the value of the nth number
Run Code Online (Sandbox Code Playgroud)

功能计划如何运作?

如果我的定义错了,请纠正我.请随意发表评论..

Tob*_*bia 53

上面的声明性编程示例不是实际的程序,因此它不是一个好例子.

主要区别在于命令式和声明性之间.功能是一种特殊的声明.

C,C++,Java,Javascript,BASIC,Python,Ruby和大多数其他编程语言都是必不可少的.通常,如果它具有显式循环(for,while,repeat),它们在每个循环中使用显式赋值操作来更改变量,那么这是必要的.

SQL和XSLT是声明性编程的两个众所周知的例子.标记语言(如HTML和CSS)也是声明性的,尽管它们通常不足以描述任意算法.

下面是一个示例计算(按性别划分收入,来自合适的数据源),首先用命令式语言(Javascript)编写,然后用声明性语言(SQL)编写.

命令式编程

var income_m = 0, income_f = 0;
for (var i = 0; i < income_list.length; i++) {
    if (income_list[i].gender == 'M')
        income_m += income_list[i].income;
    else
        income_f += income_list[i].income;
}
Run Code Online (Sandbox Code Playgroud)

注意:

  • 显式初始化将包含运行总计的变量;
  • 显式循环数据,在每次迭代时修改控制变量(i)和运行总计;
  • conditionals(ifs)仅用于在每次迭代时选择代码路径.

声明性编程

select gender, sum(income)
from income_list
group by gender;
Run Code Online (Sandbox Code Playgroud)

注意:

  • 包含运行总计的内存单元格由您声明的输出隐含 ;
  • 任何回路中的CPU将需要执行被(例如通过income_list表.)暗示通过声明要与由所述源数据的结构的输出;
  • 条件(例如,case在SQL中)以功能性方式用于根据输入值指定所需的输出值,而不是选择代码路径.

功能编程

正如我上面提到,SQL的case是的一个很好的例子的功能编程的方式,这是在其中所期望的计算由指定声明性编程的一个有限子集构成的功能.

功能是事物接受输入和反馈输出(例如case,sum()...)

组合物是指通过指定一个的输出被馈送作为输入到下两个或更多个一起(典型地通过写入一个在另一个内部.)最后整个组合物,这仍然是本身大的函数,施加到可用输入以获得所需的输出.

在这个片段中,我宣布由我想要的输出组成的功能 sum()case.这称为函数式编程:

select 
    sum(case when some_flag = 'X' then some_column
        else some_other_column end)
from
    ...
Run Code Online (Sandbox Code Playgroud)

如果两个或多个功能的组合物和它们的应用到所述输入数据是在一个给定laguage唯一可用的构建体,该语言被认为是纯粹的功能.在这些语言中,您会注意到完全没有循环,变量赋值和其他典型的命令式语句.


编辑:我建议观看Anjana Vakil关于Javascript函数式编程的一些讨论,以便更好地了解它的内容.

  • 这是一个很好的答案,我终于对声明式编程是什么有了一些了解!@托比亚 (3认同)
  • 今天仍然具有很强的现实意义。太棒了!说得好。 (2认同)
  • 所以,在 C++ 中,std::sort(a.begin(),a.end()); 可以说是声明式程序吗? (2认同)

She*_*III 7

声称命令式编程与声明式编程的区别在于错误地假设后者缺乏顺序,这是一种错误的过度简化。

纯函数式编程并不妨碍表达顺序和实现,而是不太能够在操作语义层面表达随机的偶然顺序。它还具有“不要重复自己”(DRY)的优点,这是声明式风格的一种形式(见下文)。

然而,纯函数式编程并不能保证声明性的高级语义。为此,您需要应用声明性与命令性的正确定义


The*_*lis 6

我在Pro XAML with C#中找到了另一个有用的解释:

关于声明式

在声明式编程中,源代码的编写方式表达了代码的期望结果,很少或根本不强调实际实现。

当务之急

命令式编程与声明式编程相反。如果声明式编程可以被认为是声明期望的结果是什么,那么命令式编程可以被视为编写代表如何实现期望结果的指令的代码行。