【问题标题】:Can 'programming without assignment' be considered within the definition of functional programming?可以在函数式编程的定义中考虑“没有赋值的编程”吗?
【发布时间】:2014-01-23 11:39:18
【问题描述】:

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

这个问题不是“函数式编程的定义是什么?”。假设是,我们所知道的函数式编程是几个不同想法的抓包,但边界不明确。

现在是相当了不起的书 Structure and Interpretation of Computer Programs contains the following reference 到术语函数式编程

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

在我看来这很奇怪。

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

【问题讨论】:

  • 好吧,如果 SICP 说它是,它就是。或者至少,这是一个有影响力的声音说它是。但是,就像这里关于 SO 的许多定义性问题一样,您付钱并做出选择。 函数式编程没有一个真正的定义,你似乎知道。无论我(或你)是否同意 SICP 中的观点并不重要,它的作者对函数式编程提出了一个有趣的观点,在考虑这些问题时我很乐意考虑这一点。我发表评论是因为我认为这是一个意见问题,在 SO 上对此不赞成。

标签: functional-programming variable-assignment sicp


【解决方案1】:

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

我在这里假设 assignment 是指变量的突变。请注意,这与 绑定

完全不同
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))。

现在我们可以在决定(仅)使用纯函数编程是否确实是函数式编程之前得到一些爆米花。 :)

【讨论】:

  • 谢谢 - 这真的很有帮助。毕竟原始评论听起来更接近我的定义。
猜你喜欢
  • 2017-05-24
  • 2011-01-13
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多