我试图理解函数式编程和命令式编程(以及所有其他衍生物)之间的区别。但是,我被一个简单的概念所困扰,许多网站和书籍都没有解释:什么是执行顺序。
据我所知,函数式编程并不重视执行顺序,而命令式编程确实非常重视它。
但是,我不理解重要性顺序。我的意思是,如果我乘以然后除以输入数字(uno = input * 5000
后跟dos = uno / 300
),那么使用函数语言意味着程序可以以任何方式执行算术运算(不需要考虑)任何规则,如运营秩序)?函数式编程中的输出可预测性在哪里?
答案 0 :(得分:3)
评估顺序是程序将函数扩展到它们的主体中的顺序,直到您留下原语并减少计算结果的顺序。例如。
test(fun1(), fun2(), fun3());
想象一下,这是一种渴望的语言,为了应用test
,您必须拥有fun1-3生成的值。在某些语言中,运行时可以选择首先展开fun3
,然后fun1
展开,最后展开fun2
。如果没有使用副作用,则无关紧要。如果每个人在屏幕上显示某些内容,您会突然有6种不同的结果。
在函数编程中,您可以避免大多数代码中的副作用。没有副作用,评估的顺序确实无关紧要。
当说在所有编程语言中都有强制特定订单的方法。在没有参数评估顺序的热切语言中,如Scheme,您可以将表达式嵌套在自己的lambda表单中。
((lambda (val1)
((lambda (val2)
((lambda (val3) (/ (* val1 val2) val3))
expression3)) ; evaluated third
expression2)) ; evaluated second
expression1) ; evaluated first
这当然是let*
所做的,所以你可以这样写:
(let* ((val1 expression1)
(val2 expression2)
(val3 expression3))
(/ (* val1 val2) val3))
Haskell,这是一种纯粹的功能性懒惰评估语言,可以使用monad做同样的事情。然后,生成下一个值的函数取决于前一个返回的值。链使得执行顺序成为一条稳定的道路。
现在您不想确定订单不重要的顺序。然后编译器可以决定并且可能最终并行完成或者在常量折叠后首先执行最短的作业。
答案 1 :(得分:0)
程序与功能程序中的执行顺序
程序
在程序语言中,变量被赋予经历的值 程序执行时的更改。中的表达式的值 程序又取决于这些变量值。现在,如果顺序 不遵循执行,并为变量赋值 然后是使用这些变量的表达式的值 作为副作用可能不正确。因此,执行顺序 在命令式语言中很重要,以避免这种副作用。
功能
在函数式语言中,由于变量是不可变的,所以没有 在某些其他部分对变量所做的任何更改的副作用 的代码。然后,执行顺序变得无关紧要 语言设计者利用这种自由来建立执行的灵活性 达到最佳表现。