我已经阅读了维基百科上关于过程式编程和函数式编程的文章,但我还是有点困惑。有人能把它归结为核心吗?
当前回答
进一步阐述康拉德的评论:
求值的顺序不是 定义良好的
一些函数式语言有所谓的惰性求值。这意味着直到需要该值时才执行函数。在此之前,传递的是函数本身。
过程式语言是步骤1、步骤2、步骤3……如果在第二步你说加2 + 2,它马上就会做。在惰性求值中,你会说2 + 2,但如果结果从未被使用,它就永远不会做加法。
其他回答
在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的求值,并避免状态和可变数据。它强调函数的应用,与强调状态变化的过程式编程风格相反。
@Creighton:
在Haskell中有一个叫做product的库函数:
prouduct list = foldr 1 (*) list
或者仅仅是:
product = foldr 1 (*)
惯用语的阶乘
fac n = foldr 1 (*) [1..n]
很简单
fac n = product [1..n]
Funtional编程
num = 1
def function_to_add_one(num):
num += 1
return num
function_to_add_one(num)
function_to_add_one(num)
function_to_add_one(num)
function_to_add_one(num)
function_to_add_one(num)
#Final Output: 2
过程式编程
num = 1
def procedure_to_add_one():
global num
num += 1
return num
procedure_to_add_one()
procedure_to_add_one()
procedure_to_add_one()
procedure_to_add_one()
procedure_to_add_one()
#Final Output: 6
Function_to_add_one是一个函数
Procedure_to_add_one是一个过程
即使你运行这个函数5次,每次它都会返回2
如果你运行这个过程五次,在第五次运行结束时,它会给你6。
免责声明:显然,这是对现实的一种超简化的看法。这个答案只是让我们了解了“函数”而不是“过程”。仅此而已。一旦你尝到了这种肤浅而深刻的直觉,开始探索这两种范式,你就会开始清楚地看到它们的区别。
对我的学生有帮助,希望对你们也有帮助。
函数式编程与不使用全局变量的过程式编程相同。
如果你有机会,我建议你买一份Lisp/Scheme,然后用它来做一些项目。最近流行起来的大多数思想都是在几十年前用Lisp表达的:函数式编程、延续(作为闭包)、垃圾收集,甚至XML。
所以这将是一个很好的方法来开始所有这些当前的想法,以及一些其他的,比如符号计算。
您应该知道函数式编程擅长什么,不擅长什么。它并不是什么都好。有些问题最好用副作用来表达,同样的问题会根据提问的时间给出不同的答案。