函数式编程和声明式编程有什么区别?

5

我希望了解函数式编程和声明式编程的区别。

你能给我展示一个代码是声明式的但不是函数式的例子吗?
是否可能是函数式的但不是声明式的,即命令式的?

1个回答

7
一种非功能性的声明式语言是PROLOG。在PROLOG中编程是陈述一些事实,然后提出问题,系统会尝试验证或否定这些问题。
例如:
human(socrates).       // "Socrates is a human."
mortal(X) :- human(X). // "If X is a human, then X is mortal" or
                       // "All humans are mortal."

? mortal(socrates)     // Is Socrates mortal?
Yes.
? mortal(X)            // Who is mortal?
socrates               
? mortal(pythagoras). 
No.                    // since system doesn't know about any human except Socrates

另一个众所周知的声明性语言是 SQL,但它不是函数式的。

需要注意的是,在 PROLOG 的例子中,没有函数作为一等值。确实,SQL 和 PROLOG 都有一些内置函数,但它们没有办法让你编写自己的函数。有人可能会认为这条规则:

mortal(X) :- human(X).

"is a function",但它实际上是推理规则。因此,它是声明性的,非函数式的语言。

对于您问题的第二部分:在函数式编程语言中编写命令式代码当然是可能的。Simon Peyton Jones曾经说过,他认为Haskell是世界上最好的命令式编程语言(这只是半开玩笑)。

例如:

 main = do
      print "Enter a number"
      line <- getLine
      print (succ (read line :: Int))

1
好的,如果我理解正确,您不一定需要将函数声明为声明式,并且您不必是声明式的才能成为功能性的。 - gabox01
但是假设你想同时具有函数式和命令式的特性。那么你最终会改变状态,这在FP中是被禁止的,对吧? - gabox01
@gabox01 - 关于第二点要小心。我仅仅说过你可以在函数式语言中编写看起来像命令式的代码。 - Ingo
函数式编程是否只是为了避免状态的改变而采用声明式风格? - gabox01
@gabox01 我不这么认为。 - Ingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接