任何功能语言本能支持分而治之吗?

afe*_*par 13 functional-programming

对不起,我无法找到在标题中更清楚地表达问题的方法,但基本上就是这样:几乎所有函数式语言都有允许你通过尾递归处理变量参数列表的结构,如在这个Erlang-ish伪代码中总结了一个数字列表:

sumup(0,A) -> A.
sumup(N,A) -> sumup(N) + A.
Run Code Online (Sandbox Code Playgroud)

然而,函数式语言对我的一个重要吸引力是它们固有的并行性.即使诸如总结一个数字列表之类的问题显然是可以并行化的,并且几乎肯定会通过分而治之的方式最有效地处理,但我并不知道语言功能使这成为一种自然的编程方式.事实上,除非语言具有允许读取基于给函数的参数的数量和基于索引检索参数的功能,我没有看到一个人如何做到这一点.是否有任何功能语言具有鼓励分而治之的编程的功能?

Nor*_*sey 7

是否有任何功能语言具有鼓励分而治之的编程的功能?

是:能够在库中创建新的高阶函数.

无论如何,在列表上最重要的这样的函数之一是foldr,当应用于关联运算符时,原则上可以并行化,尽管在实践中很少这样做.为什么?因为foldr是围绕顺序数据流设计的.

功能语言的优点在于,一旦识别出这个问题,我们就可以解决问题,而不是通过引入新的语言功能,而是通过更加智能地使用我们已有的功能.看看如何,看看2009年8月Guy Steele的演讲,他在那里解释了为什么foldr不是并行函数式编程的正确库函数,他建议

  • 一种新的编程风格
  • 列表的新表示
  • 库的新高阶​​函数

这些都旨在支持分而治之的编程.

我在这次演讲中发现的令人兴奋的是,没有必要引入新的语言功能来支持"原生"的分而治之的编程. 它足以获取我们已有的原语并使用它们来设计更好的库.

如果您可以访问ACM数字图书馆,您可以看到Guy的谈话组织并行执行功能代码的视频,或者正如Ben Karel指出的那样,您可以看到Malcom Wallace在Vimeo上拍摄的视频.