【问题标题】:Understanding Functional Programming理解函数式编程
【发布时间】:2015-07-31 08:05:22
【问题描述】:

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

据我了解,命令式编程(简而言之)是基于变异、控制结构(例如循环和赋值)。

当我学习有关函数式编程的课程时,他们提到了一点。我想深入了解它..

重点是:

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

我从中了解到的是,分配给特定变量的值/系数应该相同,并且不能不时重新分配以从中创建抽象定义。 这是正确的吗 ?

你能多加点吗?

【问题讨论】:

    标签: scala functional-programming imperative-programming


    【解决方案1】:

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

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

    第一种方法(图灵机)有一个关于记录在磁带上的状态的想法,并且可以更改。这种方法也将算法视为一系列步骤。

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

    F.e.让我们看看正弦函数的泰勒级数:

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

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

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

    【讨论】:

    【解决方案2】:

    如果没有突变,则没有必要的变量。这是第一个。

    更重要的是命令式编程有利于实现算法 - 逐步说明如何做某事,而函数式编程更好地实现概念 - 术语定义为其他术语等。函数式编程更接近数学理论,数学理论通常基于某些事物的定义而不是算法。

    【讨论】:

      【解决方案3】:

      非常正确 - 如果您不更改变量值,则更容易证明您的程序是正确的。
      如果您有可变状态,则您的程序取决于您的环境,并且函数调用顺序可能很重要。在这样的情况下

      var a = "test"
      def foo() = {
          a = "foo"
      }
      def bar() = a
      

      您的两个函数都可以正常工作,但它们的组合可能会失败(如果您期望 bar() 中的“测试”)。在函数式方法中,如果您的程序的某些部分是正确的,那么您的程序作为一个整体是正确的。

      【讨论】:

        猜你喜欢
        • 2012-06-13
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 2021-09-10
        • 2017-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多