自过去6个月以来,我开始学习函数式编程的概念。 在阅读许多资源时,我发现的一件事是在函数式编程中,执行顺序是不确定的!我不清楚这一点。
从其他Stack Overflow回答:https://stackoverflow.com/a/23290/1276021,“功能语言”(理想情况下)允许您编写“数学函数”。
但是,正如在数学函数中一样,f(g(x)) !== g(f(x))
- 意思,执行顺序。
似乎我理解“执行顺序未定义”的概念是错误的。我哪里错了?
答案 0 :(得分:3)
f(g(x)) !== g(f(x))
- 意思是执行顺序。
不,这些是不同的表达/程序,而不仅仅是不同的执行顺序。
我似乎错误地理解了#34;执行顺序未定义的概念"
正确,更详细的陈述将是" 表达式各部分evaluation的顺序无关紧要" (并且将始终导致相同的结果)。这意味着这样的函数式语言没有side effects和referential transparency - 两个非常重要的属性,用于证明"数学"功能也有。
如果我们定义两个函数
f(x) = x*3
g(y) = y+1
然后尝试评估表达式f(g(1))
,我们是否先做
f(g(1))
= f(1+1)
= f(2)
= 2*3
= 6
或
f(g(1))
= g(1)*3
= (1+1)*3
= 2*3
= 6
无论我们首先应用哪种功能,我们总是到6岁。
答案 1 :(得分:2)
是的,执行的顺序由编译器完成,对程序员来说并不重要。
但每个函数的输入 的重要性是什么:
考虑这个例子:
a(b(x)) + b(x) + c(b(x))
编译器将决定首先计算b(x)
的结果,然后在a
和c
函数调用中使用该结果。但是,一个非常差的优化编译器可能决定找出b(x)
然后用结果调用a
然后再次找出b(x)
然后找出c(b(x))
。最终他们都会得到相同的答案,所以就程序员而言,执行的顺序是无关紧要的。大多数情况下,一个编写良好的编译器会比使用命令式语言更好地找出最好的执行顺序 far ,特别是当事情变得复杂时,所以它是最好的不要考虑执行的顺序,而应将其作为编译器要解决的实现细节。