functional-programming - 函数式编程是声明式编程的一种吗?

标签 functional-programming declarative-programming

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

最佳答案

简答 : .

维基百科定义 declarative programming作为:

In computer science, declarative programming is a programming paradigm - a style of building the structure and elements of computer programs - that expresses the logic of a computation without describing its control flow.



或者说得有点大胆:“说出你想要的,而不是你想要的。”。

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

functional programming的定义另一方面是:

In computer science, functional programming is a programming paradigm - a style of building the structure and elements of computer programs - that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data. It is a declarative programming paradigm, which means programming is done with expressions or declarations instead of statements.



基于这些定义,可以说函数式编程是声明式编程的一个子集。然而,在实际意义上,如果我们遵循严格的定义,现在没有任何编程语言是纯粹的、明确的声明性或功能性的。然而,可以说 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
    

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

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

    关于functional-programming - 函数式编程是声明式编程的一种吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45054266/

    相关文章:

    wpf - WPF/XAML 的开源替代品有哪些?

    java - 使用声明式风格查找一个 Set 中的字符串是否是另一个 Set 中的字符串的子字符串?

    haskell - 将高阶函数提升到 monad

    .net - 重复追加到列表直到抛出异常

    Ruby Map/Reduce 函数必须高效吗?

    programming-languages - 声明式编程语言的反馈,资源和信息

    functional-programming - 以 CS101 学生可以理解的方式描述 Damas-Milner 类型推理

    f# - 在 F# 中对一系列相等的字符进行切片/分组

    Prolog 'is/2' 谓词实现