Functional programming 函数式编程是一种声明式编程吗?
我知道声明式编程只是传递输入并期望输出,而没有说明过程是如何完成的。在函数式编程中,是一种编程范式,它接受输入并返回输出。当我检查高阶函数编程时,我们将一个函数传递给map/reduce,这并没有揭示它是如何完成的。那么,高阶函数式编程和声明式编程是一样的吗 简短回答:否 维基百科的定义如下: 在计算机科学中,声明式编程是一种编程语言 范例-一种构建计算机结构和元素的风格 程序-表示计算逻辑而不描述 它的控制流 或者大胆地说:“说出你想要的,而不是你想要的方式。” 因此,这与命令式编程语言不同,命令式编程语言将程序视为一组一个接一个地执行的指令。Functional programming 函数式编程是一种声明式编程吗?,functional-programming,declarative-programming,Functional Programming,Declarative Programming,我知道声明式编程只是传递输入并期望输出,而没有说明过程是如何完成的。在函数式编程中,是一种编程范式,它接受输入并返回输出。当我检查高阶函数编程时,我们将一个函数传递给map/reduce,这并没有揭示它是如何完成的。那么,高阶函数式编程和声明式编程是一样的吗 简短回答:否 维基百科的定义如下: 在计算机科学中,声明式编程是一种编程语言 范例-一种构建计算机结构和元素的风格 程序-表示计算逻辑而不描述 它的控制流 或者大胆地说:“说出你想要的,而不是你想要的方式。” 因此,这与命令式编程语言不同,
map
等没有揭示该过程的事实并不意味着它是声明性的:可以使用许多专有的C库,不允许您检查源代码。然而,这并不意味着它们是声明性的
另一方面,对的定义是:
在计算机科学中,函数式编程是一种编程范式
-建立计算机程序结构和元素的一种方式,它将计算视为对数学函数的评估,并避免改变状态和可变数据。它是一个声明性语句
编程范例,这意味着编程是通过表达式完成的
或声明而不是声明
基于这些定义,可以说函数式编程是声明式编程的子集。然而,从实际意义上讲,如果我们遵循严格的定义,那么现在没有一种编程语言是纯粹的、不含糊的声明性或函数性的。但是,可以说Haskell比Java更具声明性
声明式编程通常被认为是“更安全的”,因为人们往往难以管理副作用。许多编程错误是由于没有考虑到所有的副作用。另一方面,很难做到这一点
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问题:。