函数编程是否与数学如此相关,因为很多函数编程都是用数学概念来表示的?对于具有一定背景的程序员,必须具有扎实的数学基础才能学习和理解函数式编程?
函数编程是否与数学如此相关,因为很多函数编程都是用数学概念来表示的?对于具有一定背景的程序员,必须具有扎实的数学基础才能学习和理解函数式编程?
Answers:
所有编程都与数学有关。实际上,许多大学仍将其计算机科学程序置于数学系的职权范围内。
至于学习函数式编程,您不需要具备扎实的数学基础即可学习它。我现在已经学会了三种不同的功能语言,达到了一定的熟练程度(Haskell,Erlang,Clojure),而我自己的数学技能却非常薄弱。Haskell的社区的确可以以数学为中心来谈论事物,这有点令人讨厌,但是Erlang和Clojure都是非常实用的函数式编程语言,因为教程信息是表面上写的,所以它们并不难学对于程序员而言,不是硬核数学极客。话虽这么说,尽管我在数学上有障碍,但我确实选择了Haskell,所以这并非没有可能。
我在选择一般的声明式编程语言(功能是其中的一个子集)时发现的真正困难是放弃了控制的欲望。告诉计算机该怎么办。这需要一些习惯。
是。本质上,一个功能程序就是一堆这样的语句:
// 1_和2_是“虚拟参数” f(1_):= sin(1_)g(1_,2_):= 1_ + 2_等...
x = f()
y = g(x)
z = h(x,h2(y))
等等...
您正在以方程式的形式编写程序应该做的事情,这些方程式将新值(注意:不是变量)定义为先前定义的值的函数。您还将功能定义为关系。这确实与数学定理的编写方式非常相似。
IMO Mathematica,作为您可以使用函数式编程的语言的示例,不需要强大的数学背景。实际上,我认为我在基础数学教学中没有遇到像函数式编程这样的事情。我开始使用C风格进行Mathematica编程,仅几年后就发现了函数式编程。我不认为基本的功能编程结构喜欢Map
,Apply
,NestList
,等需要在所有任何的数学背景。
并不是的。函数式编程只是一种方法,但是它的基础是lambda微积分和类似的东西。
闭包是(小的)尝试将函数式编程概念引入过程语言。代替for(int i =0 ; i < num; i++) doStuff(arr[i]);
,您可以假设数组的元素固有地可以对它们进行“填充”,因此arr.each do |el| doStuff(el) end
The term closure is often mistakenly used to mean anonymous function. This is probably because most languages implementing anonymous functions allow them to form closures and programmers are usually introduced to both concepts at the same time. These are, however, distinct concepts. A closure retains a reference to the environment at the time it was created (for example, to the current value of a local variable in the enclosing scope) while a generic anonymous function need not do this.