Functional programming 函数式编程中的可伸缩性

Functional programming 函数式编程中的可伸缩性,functional-programming,Functional Programming,我听说用函数式语言编写的程序可以更好地扩展。这是真的吗?如果是的话,那么与非函数式语言有什么区别导致了这种情况?考虑到这不是最佳的,我有疑问 当然,这并不全是好事。C 快速排序使用了一种非常巧妙的方法 霍尔发明的技术 它将数组排序到位;就是, 无需使用任何额外存储。作为一个 结果,它运行得很快,而且速度很快 少量内存。相反, Haskell程序分配了相当多的资源 在幕后有很多额外的记忆, 并且运行速度比C慢 节目 这些巧妙的技术通常决定了应用程序的伸缩性 无论你从谁那里听到这句话,他都很可能是指

我听说用函数式语言编写的程序可以更好地扩展。这是真的吗?如果是的话,那么与非函数式语言有什么区别导致了这种情况?

考虑到这不是最佳的,我有疑问

当然,这并不全是好事。C 快速排序使用了一种非常巧妙的方法 霍尔发明的技术 它将数组排序到位;就是, 无需使用任何额外存储。作为一个 结果,它运行得很快,而且速度很快 少量内存。相反, Haskell程序分配了相当多的资源 在幕后有很多额外的记忆, 并且运行速度比C慢 节目


这些巧妙的技术通常决定了应用程序的伸缩性

无论你从谁那里听到这句话,他都很可能是指“不允许副作用提供了参考透明度,这使得验证、优化和程序更容易,并且更容易编写自动化工具来执行这些任务。”

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

之间的差异。
int a;
void increment_a() {
    a++;
}


第二种方法没有副作用,并且可以并行运行,前提是您可以对代码进行结构化,以便提供所有必要的输入。

编程语言的选择对程序的伸缩性没有影响。这是程序设计的一个功能。一个设计良好的C程序可以很好地扩展(假设这是一个设计目标),而设计糟糕的Erlang可以非常糟糕地扩展

如果这是真的,我认为可能有三个因素在起作用:

  • 功能程序具有一些特性,这些特性使得在设计程序时更容易考虑可伸缩性。可能吧,但我还没有参与过大规模的项目,所以我不能说。至少在Haskell中,纯度是人们用于设计大型程序的大多数特性的根源,例如。但大多数函数式语言并不纯粹

  • 使用函数式语言工作时的设计要求使预先考虑这些问题变得更容易。人们经常认为,设计良好的函数程序是作为将输入转换为输出的函数而创建的。也许以这种方式思考会使我们更容易提前解决规模(和模块化)问题

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


  • 我认为您的最后一句话有点短视:您可以尝试使用许多巧妙的技巧使您的应用程序具有良好的可扩展性,但如果底层架构的可扩展性不好,那么即使是巧妙的技巧也只不过是创可贴。(顺便说一句,我没有投反对票)我想这篇文章是个笑话;这篇讲述故事的文章读起来像洋葱。(我还没有投反对票,但我仍然有可能)。@stakx:我开始回答这些问题,但后来我突然想到,既然OP是在问函数式编程语言,他可能在谈论算法可伸缩性,而不是系统可伸缩性@是的,yeg的帖子是个笑话,但它太棒了!那么什么是参考透明度呢?编辑我的答案以供评论。Wikipedia说“一种属性,在不影响程序的情况下,表达式可以被它的值替换。”@jamesj:如果你有
    y=x
    ,那么
    y
    可以替换程序中的任何地方(反之亦然)。这在命令式语言中通常是不正确的,因为在执行过程中可以更改
    x
    的值。函数式语言倾向于阻止这类事情,而一些(如Haskell和Clean)强烈限制了可以更改数据的上下文。这种编码方式的另一个症状是,您的函数始终是确定性的,可以在上游缓存,从而产生巨大的效果。
    int increment(int a) {
        return a+1;
    }