我听说用函数式语言编写的程序往往更好地扩展。这是真的吗?如果是这样的话那么导致这种情况的非功能语言的区别是什么?
答案 0 :(得分:3)
无论你从何处听到这一点,很可能是指“不允许副作用提供引用透明度,这使得更容易验证,优化和parallelize程序,并且更容易编写自动化工具来执行那些任务。“
换句话说,功能程序往往没有副作用(修改全局状态),因此并行运行多个功能程序实例应该产生相同的输出。例如,考虑
之间的区别int a;
void increment_a() {
a++;
}
和
int increment(int a) {
return a+1;
}
第二个没有副作用,并且可以并行运行,只要您构建代码以便提供所有必要的输入。
答案 1 :(得分:2)
编程语言的选择对程序的扩展程度没有影响。这是该计划设计的一个功能。精心设计的C程序可以很好地扩展(假设这是一个设计目标),而设计不良的Erlang可以扩展得非常差。
如果确实如此,我建议可能有三个因素起作用:
功能程序具有以下功能,可以更轻松地设计具有可扩展性的程序。可能,但我没有参与大型项目,所以我不能说。至少在Haskell中,纯度是人们用来设计大型程序(如Software Transactional Memory)的大多数功能的根源。但大多数函数式语言并不纯粹。
使用函数式语言进行设计时,可以更容易地预先考虑这些问题。人们经常认为,精心设计的功能程序是作为将输入转换为输出的功能而创建的。也许以这种方式思考可以更容易地预先解决规模(和模块化)问题?
功能语言往往是新语言结构,编程模型等的测试基础。因此,他们可能有更多内置的东西来解决规模问题。我当然认为这是Erlang成功的一部分:核心语言和库对容错分布式处理有很好的支持,因为它是语言目的的一部分。因此,编写容错分布式代码可能相对简单。但同样,这部分是针对Erlang的。对于Haskell或SML,相同的设计目标是不正确的。
答案 2 :(得分:-2)
考虑到quicksort example in Haskell不是最优的,我有疑虑。
当然,并不是所有的玫瑰。 C quicksort使用非常巧妙 技术,由Hoare发明,其中 它将阵列分类到位;那是, 不使用任何额外的存储空间作为一个 结果,它运行得很快,并在一个 少量记忆。相反, Haskell程序分配了很多 幕后有很多额外的记忆, 并且运行速度比C慢 程序
这些巧妙的技巧通常决定了应用程序的扩展程度。 Here's another telling article about functional programming