函数式编程是一种声明式编程吗?

MrR*_*ot9 8 functional-programming declarative-programming

我知道声明性编程只是传递输入并期望输出而不说明程序是如何完成的.在函数式编程中,是一种编程范例,它接受输入并返回输出.当我检查高阶函数编程时,我们传递一个map/reduce函数,它没有透露程序是如何完成的.高阶函数编程和声明式编程是一样的吗?

Wil*_*sem 8

简答:.

维基百科声明性编程定义为:

在计算机科学中,声明性编程是一种编程范式 - 一种构建计算机程序结构和元素的方式 - 表示计算的逻辑而不描述其控制流程.

或声明有点大胆:"说什么你想要的,不是如何你想它."

因此,这与命令式编程语言形成对比,在命令式编程语言中,程序被视为一组接一个地完成的指令.map等等没有透露过程的事实并没有使它声明:可以使用许多专有的C库,并且不允许您检查源代码.然而,这并不意味着这些都是声明性的.

另一方面,函数式编程的定义是:

在计算机科学中,函数式编程是一种编程范式 - 一种构建计算机程序结构和元素的方式 - 将计算视为数学函数的评估,避免改变状态和可变数据.它是一种声明性编程范例,这意味着使用表达式或声明而不是语句来完成编程.

基于这些定义,可以说功能编程是声明性编程的一个子集.然而,在实际意义上,如果我们遵循严格的定义,那么现在没有任何编程语言是纯粹的,并且不具有说明性功能性.然而,可以说Haskell 比Java更具说明性.

声明性编程通常被认为是"更安全",因为人们往往难以管理副作用.许多编程错误是不考虑所有副作用的结果.另一方面很难

  1. 设计一种语言,允许程序员描述他想要的东西而不用详细说明如何去做;
  2. 实现一个编译器,它将基于这样的程序生成一个有效的实现; 和
  3. 有些问题有固有的副作用.例如,如果您使用数据库,网络连接或文件系统,那么读取/写入文件应该具有副作用.当然,人们可以决定不使用编程语言的这一部分(例如,许多约束编程语言不允许这些类型的操作,并且在较大的系统中是"子语言").

已经有几次尝试设计这种语言.在我看来,最流行的是逻辑编程,函数编程约束编程.每个都有其优点和问题.我们还可以在例如数据库(如SQL)和文本/ XML处理(使用XSLT,XPath,正则表达式 ......)中观察这种声明性方法,其中一个没有指定查询的解析方式,而只是通过例如指定正则表达式正在寻找什么.

然而,编程语言是否具有声明性,是一种模糊的讨论.虽然编程语言,建模语言和库(如Haskell,Prolog,Gecode等)确实使编程更具说明性,但这些可能不是最严格意义上的声明.在最严格的意义上,人们应该认为无论你如何编写逻辑,编译器总会得到相同的结果(尽管可能需要更长的时间).

比如我们想要检查Haskell中的列表是否为空.我们可以这样写:

is_empty1 :: [a] -> Bool
is_empty1 [] = True
is_empty1 (_:_) = False
Run Code Online (Sandbox Code Playgroud)

但是我们也可以像这样写它:

is_empty2 :: [a] -> Bool
is_empty2 l = length l == 0
Run Code Online (Sandbox Code Playgroud)

两者都应该为相同的查询提供相同的结果.如果我们给它一个无限的列表,is_empty1 (repeat 0)将返回,Falseis_empty2 (repeat 0)将永远循环.所以这意味着我们仍然在程序中写了一些"控制流":我们已经在某种程度上定义 Haskell应该如何评估它.虽然惰性编程会导致程序员没有真正指定应首先评估的内容,但仍然有规范Haskell如何评估它.

据一些人说,这是编程指定之间的区别.我的一个教授曾经说过,据他介绍,所不同的是,如果在程序的东西,你已经在某种程度上控制有关如何事情进行评估,而当你指定的东西,你无法控制的.但同样,这仅仅是一个在很多定义的.