函数式编程与声明式编程VS势在必行的编程

我一直习惯于使用命令式编程(Imperative Programming),这是通知计算机逐步执行程序以获得最终结果的常用方式。 另一方面,声明性编程只是传递输入,并期望输出没有说明过程如何完成。 我感到困惑的是函数式编程。 我知道函数编程是一种编程范例,它将计算看作是数学函数的评估,避免了状态和可变数据,而不是一种声明性语言。 但是,我不能理解它是如何工作的。

我们举一个执行斐波纳契数字的例子。

命令式编程:

#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(); 
} 

声明式编程:

Give the nth number and it will return the value of the nth number

功能程序如何工作?

另外,如果我的定义错误,请纠正我。 请随意发表评论..


你上面的声明性编程的例子不是一个真正的程序,所以它不是一个好例子。

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

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;
}

注意:

  • 显式初始化将包含运行总数的变量;
  • 显式循环数据,在每次迭代时修改控制变量( i )和运行总数;
  • 条件( if s)仅用于在每次迭代中选择代码路径
  • 声明式编程

    select gender, sum(income)
    from income_list
    group by gender;
    

    注意:

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

    正如我上面提到的,SQL的case是编程功能方式的一个很好的例子,它是声明性编程的一个有限子集,其中通过编写函数来指定期望的计算。

    函数是接受输入和返回输出的东西(例如casesum() ...)

    组合意味着通过指定一个人的输出如何作为下一个的输入(通常通过在另一个内部写入一个)来链接两个或更多个。最后,整个组合仍然是一个大功能,被应用于可用输入来获得所需的输出。

    在这个片段中,我通过构造函数sum()case声明了我想要的输出。 这被称为函数式编程:

    select 
        sum(case when some_flag = 'X' then some_column
            else some_other_column end)
    from
        ...
    

    如果两个或多个函数的构成及其对输入数据的应用是给定语言中唯一可用的结构,则该语言被认为是纯功能的 。 在这些语言中,您会注意到完全没有循环,变量赋值和其他典型的命令式语句。


    编辑:我建议看一些Anjana Vakil关于Javascript中函数式编程的谈话,以更好地了解它的含义。


    声称命令式编程与声明式编程的区别在于错误地假定后者缺乏排序是错误的过分简化。

    纯粹的函数式编程不会阻止表达顺序和实现,相反,在操作语义层次上表达随机意外顺序的能力较差。 另外它具有“不要重复自己”(DRY)的优点,这是一种声明式风格(见下文)。

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


    想想c过滤器。 从标准输入读取并写入标准输出的地方。 代码可能是必要的,但是程序使用像一个函数。 假设你有一个程序的功能,然后管道:

    cat foo  |function |tee bar

    将通过函数过滤foo的内容,然后通过过滤器三通来写入标准输出和创建栏。 也可以考虑grep和awk,这两者中的迭代器都是隐含的,它们的用法与函数类似。

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

    上一篇: Functional Programming Vs Declarative Programming Vs Imperative Programming

    下一篇: What is Turing Complete?