理解函数式编程
Understanding Functional Programming
希望我能正确思考我的问题。
据我所知,命令式编程(非常简短)是基于突变、控制结构(例如循环和赋值)。
当我在学习函数式编程的课程时,他们提到了一点。我想深入了解一下..
重点是:
如果我们想按照他们的数学理论来实现高级概念,就没有突变的余地。
我从这里了解到,分配给特定变量的 value/co-efficient 应该是相同的,并且不能不时地重新分配以从中创建抽象定义。
这是正确的吗 ?
你能再补充点吗?
非常正确 - 如果您不更改变量值,则更容易证明您的程序是正确的。
如果你有可变状态,你的程序取决于你的环境,函数调用顺序可能很重要。在
这样的情况下
var a = "test"
def foo() = {
a = "foo"
}
def bar() = a
您的两个函数都可能正常工作,但它们的组合可能会失败(如果您期望来自 bar() 的 "test")。在函数式方法中,如果程序的某些部分是正确的,那么整个程序都是正确的。
如果没有突变,就不需要变量。这是第一个。
更重要的是命令式编程有利于实现算法 - 一步步说明如何做某事,而函数式编程更适合实现概念 - 用其他术语等定义的术语。函数式编程更接近数学理论,数学理论通常基于某些事物的定义而不是算法。
你可以这么想。 20世纪初,数学水平已经很高,科学家们已经能够将其应用于数学方法的研究,特别是计算和证明。
作为研究的结果,有两种主要方法:图灵机和λ演算。
第一种方法(图灵机)有一个关于记录在磁带上并且可以更改的状态的想法。此外,这种方法将算法视为一系列步骤。
在第二种方法(lambda 演算)中,任何计算都被视为几个函数的组合。
F.e。让我们看看正弦函数的泰勒级数:
第一个表达式给我们一个函数计算的例子。没有计算正弦的步骤,只有函数组合。这些函数的输入是两件事:x
和一系列自然数 1, 2, ...
。我们映射一些复杂的函数到系列的每个元素,然后我们在函数的帮助下减少新系列到单个值+
.
第二个表达式给我们一个命令式计算的例子。至少我们可以在这里看到单独的计算步骤。
您可以在书中找到关于函数式编程的精彩介绍 Structure and Interpretation of Computer Programs。
希望我能正确思考我的问题。
据我所知,命令式编程(非常简短)是基于突变、控制结构(例如循环和赋值)。
当我在学习函数式编程的课程时,他们提到了一点。我想深入了解一下..
重点是:
如果我们想按照他们的数学理论来实现高级概念,就没有突变的余地。
我从这里了解到,分配给特定变量的 value/co-efficient 应该是相同的,并且不能不时地重新分配以从中创建抽象定义。 这是正确的吗 ?
你能再补充点吗?
非常正确 - 如果您不更改变量值,则更容易证明您的程序是正确的。
如果你有可变状态,你的程序取决于你的环境,函数调用顺序可能很重要。在
var a = "test"
def foo() = {
a = "foo"
}
def bar() = a
您的两个函数都可能正常工作,但它们的组合可能会失败(如果您期望来自 bar() 的 "test")。在函数式方法中,如果程序的某些部分是正确的,那么整个程序都是正确的。
如果没有突变,就不需要变量。这是第一个。
更重要的是命令式编程有利于实现算法 - 一步步说明如何做某事,而函数式编程更适合实现概念 - 用其他术语等定义的术语。函数式编程更接近数学理论,数学理论通常基于某些事物的定义而不是算法。
你可以这么想。 20世纪初,数学水平已经很高,科学家们已经能够将其应用于数学方法的研究,特别是计算和证明。
作为研究的结果,有两种主要方法:图灵机和λ演算。
第一种方法(图灵机)有一个关于记录在磁带上并且可以更改的状态的想法。此外,这种方法将算法视为一系列步骤。
在第二种方法(lambda 演算)中,任何计算都被视为几个函数的组合。
F.e。让我们看看正弦函数的泰勒级数:
第一个表达式给我们一个函数计算的例子。没有计算正弦的步骤,只有函数组合。这些函数的输入是两件事:x
和一系列自然数 1, 2, ...
。我们映射一些复杂的函数到系列的每个元素,然后我们在函数的帮助下减少新系列到单个值+
.
第二个表达式给我们一个命令式计算的例子。至少我们可以在这里看到单独的计算步骤。
您可以在书中找到关于函数式编程的精彩介绍 Structure and Interpretation of Computer Programs。