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

haw*_*eye 4 functional-programming sicp variable-assignment

我知道函数式编程有几个定义.我认为这是一个模糊的类别.我的个人定义与" 参考透明度 " 接近.

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

现在,相当惊人的书籍计算机程序结构和解释 包含以下对函数式编程一词的引用.

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

对我来说这看起来很奇怪.

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

Ing*_*ngo 5

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

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

int i;
i = 1;        // overwrite whatever i is with 1
Run Code Online (Sandbox Code Playgroud)

let i = 1 in ....    -- say that i is a name for an expression, here 1
Run Code Online (Sandbox Code Playgroud)

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

所以,你有它:没有变异,剩下的就是用纯函数编程(如果我们不计算没有函数的声明性编程的不同方法,但事实证明这对于某些任务来说不那么通用和更具体(想想SQL,Prolog)).

现在我们可以在决定问题之前得到一些爆米花,如果用纯函数编程(仅)功能编程.:)