理解功能编程

时间:2015-07-31 08:05:23

标签: scala functional-programming imperative-programming

我希望我正确地考虑我的问题。

就我的理解而言,命令式编程(非常简短)基于变异,控制结构,如循环和赋值。

虽然我正在学习关于函数式编程的课程,但他们提到了一点。我想深入了解它。

重点是:

如果我们想要按照他们的数学理论实现高级概念,就没有突变的地方。

我从中理解的是,分配给特定变量的值/系数应该是相同的,并且无法不时地重新分配以从中创建抽象定义。 这是对的吗 ?

你能再添加一些积分吗?

3 个答案:

答案 0 :(得分:2)

你可以这样想。在20世纪初,数学水平已经变得如此之高,科学家们已经能够将其应用于数学方法的研究,特别是计算和证据。

作为研究的结果,有两种主要方法:图灵机 lambda演算

第一种方法(图灵机)了解录制在磁带上的状态,并且可以更改。此方法也将算法视为一系列步骤。

在第二种方法(lambda演算)中,任何计算都被视为几个函数的组合。

F.e。让我们看看泰勒系列的正弦函数:

Taylor Series of sine function

第一个表达式给出了一个函数计算的例子。没有计算正弦的步骤,只有功能的组合。这些函数的输入有两个:x和一系列自然数1, 2, ...。我们一些复杂函数映射到系列的每个元素,然后我们在函数+的帮助下新系列减少为单个值。

第二个表达式使我们成为命令式计算的一个例子。至少我们可以在这里看到单独的计算步骤。

您可以在书籍Structure and Interpretation of Computer Programs中找到函数式编程的精彩介绍。

答案 1 :(得分:0)

这是完全正确的 - 如果你不改变你的变量值,那么证明你的程序是正确的要容易得多。
如果您具有可变状态,则您的程序取决于您的环境,并且函数调用顺序可能很重要。在像

这样的情况下
var a = "test"
def foo() = {
    a = "foo"
}
def bar() = a

您的两个功能都可能正常工作,但它们的组成可能会失败(如果您希望从bar()中获得“test”)。在功能方法中,如果程序的某些部分是正确的,那么整个程序是正确的。

答案 2 :(得分:0)

如果没有突变,则无需变量。那是第一次。

更重要的是,命令式编程有利于实现算法 - 逐步指示如何做某事,而函数式编程更好地实现概念 - 用于定义的术语函数式编程更接近于数学理论,它通常基于某些东西的定义,而不是算法的定义。