缩放函数式编程

时间:2011-07-10 09:25:40

标签: functional-programming

我听说用函数式语言编写的程序往往更好地扩展。这是真的吗?如果是这样的话那么导致这种情况的非功能语言的区别是什么?

3 个答案:

答案 0 :(得分:3)

无论你从何处听到这一点,很可能是指“不允许副作用提供引用透明度,这使得更容易验证,优化和parallelize程序,并且更容易编写自动化工具来执行那些任务。“

换句话说,功能程序往往没有副作用(修改全局状态),因此并行运行多个功能程序实例应该产生相同的输出。例如,考虑

之间的区别
int a;
void increment_a() {
    a++;
}

int increment(int a) {
    return a+1;
}

第二个没有副作用,并且可以并行运行,只要您构建代码以便提供所有必要的输入。

答案 1 :(得分:2)

编程语言的选择对程序的扩展程度没有影响。这是该计划设计的一个功能。精心设计的C程序可以很好地扩展(假设这是一个设计目标),而设计不良的Erlang可以扩展得非常差。

如果确实如此,我建议可能有三个因素起作用:

  1. 功能程序具有以下功能,可以更轻松地设计具有可扩展性的程序。可能,但我没有参与大型项目,所以我不能说。至少在Haskell中,纯度是人们用来设计大型程序(如Software Transactional Memory)的大多数功能的根源。但大多数函数式语言并不纯粹。

  2. 使用函数式语言进行设计时,可以更容易地预先考虑这些问题。人们经常认为,精心设计的功能程序是作为将输入转换为输出的功能而创建的。也许以这种方式思考可以更容易地预先解决规模(和模块化)问题?

  3. 功能语言往往是新语言结构,编程模型等的测试基础。因此,他们可能有更多内置的东西来解决规模问题。我当然认为这是Erlang成功的一部分:核心语言和库对容错分布式处理有很好的支持,因为它是语言目的的一部分。因此,编写容错分布式代码可能相对简单。但同样,这部分是针对Erlang的。对于Haskell或SML,相同的设计目标是不正确的。

答案 2 :(得分:-2)

考虑到quicksort example in Haskell不是最优的,我有疑虑。

  

当然,并不是所有的玫瑰。 C   quicksort使用非常巧妙   技术,由Hoare发明,其中   它将阵列分类到位;那是,   不使用任何额外的存储空间作为一个   结果,它运行得很快,并在一个   少量记忆。相反,   Haskell程序分配了很多   幕后有很多额外的记忆,   并且运行速度比C慢   程序

这些巧妙的技巧通常决定了应用程序的扩展程度。 Here's another telling article about functional programming