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

Functional programming 函数式编程是一种声明式编程吗?,functional-programming,declarative-programming,Functional Programming,Declarative Programming,我知道声明式编程只是传递输入并期望输出,而没有说明过程是如何完成的。在函数式编程中,是一种编程范式,它接受输入并返回输出。当我检查高阶函数编程时,我们将一个函数传递给map/reduce,这并没有揭示它是如何完成的。那么,高阶函数式编程和声明式编程是一样的吗 简短回答:否 维基百科的定义如下: 在计算机科学中,声明式编程是一种编程语言 范例-一种构建计算机结构和元素的风格 程序-表示计算逻辑而不描述 它的控制流 或者大胆地说:“说出你想要的,而不是你想要的方式。” 因此,这与命令式编程语言不同,

我知道声明式编程只是传递输入并期望输出,而没有说明过程是如何完成的。在函数式编程中,是一种编程范式,它接受输入并返回输出。当我检查高阶函数编程时,我们将一个函数传递给map/reduce,这并没有揭示它是如何完成的。那么,高阶函数式编程和声明式编程是一样的吗

简短回答

维基百科的定义如下:

在计算机科学中,声明式编程是一种编程语言 范例-一种构建计算机结构和元素的风格 程序-表示计算逻辑而不描述 它的控制流

或者大胆地说:“说出你想要的,而不是你想要的方式。”

因此,这与命令式编程语言不同,命令式编程语言将程序视为一组一个接一个地执行的指令。
map
等没有揭示该过程的事实并不意味着它是声明性的:可以使用许多专有的C库,不允许您检查源代码。然而,这并不意味着它们是声明性的

另一方面,对的定义是:

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

基于这些定义,可以说函数式编程是声明式编程的子集。然而,从实际意义上讲,如果我们遵循严格的定义,那么现在没有一种编程语言是纯粹的、不含糊的声明性或函数性的。但是,可以说Haskell比Java更具声明性

声明式编程通常被认为是“更安全的”,因为人们往往难以管理副作用。许多编程错误是由于没有考虑到所有的副作用。另一方面,很难做到这一点

  • 设计一种语言,允许程序员描述他想要的东西,而无需详细说明如何去做
  • 实现一个编译器,根据这些程序生成一个高效的实现;及
  • 有些问题有其固有的副作用。例如,如果您使用数据库、网络连接或文件系统,那么读取/写入文件(例如)应该有副作用。当然,您可以决定不将此部分作为编程语言的一部分(例如,许多约束编程语言不允许这些类型的操作,并且是更大系统中的“子语言”)
  • 已经有几次尝试设计这样的语言。在我看来,最流行的是逻辑编程、函数编程和约束编程。每种方法都有其优点和问题。我们还可以在实例数据库(如SQL)和文本/XML处理(使用XSLT、XPath、正则表达式等)中观察到这种声明性方法,其中不指定如何解析查询,而只是通过正则表达式(例如)指定要查找的内容

    然而,编程语言是否是声明性的,有点模糊。尽管编程语言、建模语言和库,如Haskell、Prolog、Gecode,。。。这无疑使编程更具声明性,从最严格的意义上讲,这些可能不是声明性的。从最严格的意义上讲,人们应该认为,无论您如何编写逻辑,编译器都会得到相同的结果(尽管可能需要更长的时间)

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

    is_empty1 :: [a] -> Bool
    is_empty1 [] = True
    is_empty1 (_:_) = False
    
    然而,我们也可以这样写:

    is_empty2 :: [a] -> Bool
    is_empty2 l = length l == 0
    
    对于相同的查询,两者都应该给出相同的结果。然而,如果我们给它一个无限列表,
    是空的1(重复0)
    将返回
    False
    ,而
    是空的2(重复0)
    将永远循环。这意味着我们仍然在程序中编写了一些“控制流”:在某种程度上,我们已经定义了Haskell应该如何评估它。尽管懒惰编程会导致程序员没有真正指定应该首先评估什么,但仍然有一些规范说明Haskell将如何评估它


    根据一些人的说法,这就是编程和指定之间的区别。我的一位教授曾经说过,根据他的说法,不同之处在于,当你编写某个程序时,你在某种程度上可以控制如何评估某个程序,而当你指定某个程序时,你却无法控制。但是,这只是众多定义中的一个。

    函数式编程并不完全强调计算内容,而不是如何计算。但是,函数式编程中有一些可用的模式,这些模式与您通常会与声明式编程关联的控制流模式非常相似,例如以下控制流:

    let continue=ref true in
    虽然继续做
    ...
    如果条件为cond,则继续:=false
    其他的
    ...
    完成
    

    看起来很眼熟吧?在这里,您可以看到一些声明性结构,但这一次我们的控制力更强。

    不。函数式编程本身与声明性编程不同,反之亦然。Prolog是一种逻辑编程,许多人认为它也是一种声明式编程语言。但在我看来,这些术语有点“模糊”。有关答案,请参阅前面的SO问题:。