在没有赋值的情况下编程可以在函数式编程的定义中考虑吗?

时间:2014-01-23 11:39:19

标签: functional-programming variable-assignment sicp

我知道functional programming有几个定义。我认为这是一个模糊的类别。我的个人定义接近“referential transparency”。

这个问题不是'函数式编程的定义是什么?'。假设我们所知道的是函数式编程是一些不同的想法,包含一些不明确的界限。

现在,对于术语函数式编程,这本书非常神奇Structure and Interpretation of Computer Programs contains the following reference

  正如我们在本书前两章所做的那样,不使用任何赋值的编程因此被称为函数式编程。

对我来说这看上去很奇怪。

我的问题是:可以在函数式编程的定义中考虑“无需编程编程”吗?

1 个答案:

答案 0 :(得分:5)

是的,我认为它可以,尽管Scala和LISP用户可能会称它为一个非常狭窄的定义。虽然函数式编程的一个真正定义仍然存在争议,但我们当然可以推断一些没有赋值的编程风格。

我在这里假设通过赋值,我们指的是变量的变异。请注意,这与绑定

完全不同
int i;
i = 1;        // overwrite whatever i is with 1

let i = 1 in ....    -- say that i is a name for an expression, here 1

一旦没有任务,就没有变异。当没有突变时,某些类似循环的结构变得无用。因为,每个变量只是一个在循环上下文中是常量的表达式的名称,因此循环将永远或永远运行。唯一的方法是变化"变量是通过将函数应用于某个值来实现的,该值将参数名称绑定到该函数的生命周期内和该函数的生命周期中。循环的唯一方法是递归。反过来,这使得函数非常重要,作为奖励,所有函数都必须是纯粹的,因为没有变异。

所以,你有它:没有变异,剩下的就是用纯函数编程(如果我们不计算没有函数的声明式编程的不同方法,但事实证明这不是一般的,而是更多特定于某些任务(想想SQL,Prolog))。

现在我们可以在决定问题之前得到一些爆米花,如果只使用纯函数进行编程确实是函数式编程。 :)