多线程
就 SMP parallelism† 而言,Haskell 非常有效。它是not quite automatic,但parallel library 使得并行化几乎任何事情都变得非常容易。因为 spark 太便宜了,所以你可能会很粗心,只要求 很多 并行性;然后运行时将知道该做什么。
与大多数其他语言不同,如果您拥有高度分支的数据结构、棘手的动态算法等,这不是什么大问题——由于纯函数范式,并行 Haskell 在访问时无需担心锁数据是共享的。
我认为最大的警告是内存:GHC 的垃圾收集器不是并发的,函数式风格是相当分配快乐的。
除此之外,还可以编写看起来看似并行的程序,但实际上根本不做任何工作,只是因为懒惰而开始并立即返回。一些测试和经验仍然是必要的。但是惰性和并行并不是不相容的;至少如果你确保你有足够大的“块”严格性的话。强迫一些严格的东西在很大程度上是微不足道的。
更简单、常见的并行任务(可以用 map-reduce 方式表示,或者经典的数组向量的东西——在许多语言中也很容易)通常可以在 Haskell 中使用并行库更容易处理数据结构;其中最著名的是repa。
分布式计算
在 Cloud Haskell 上有相当多的工作,它基本上是库形式的 Erlang。这种任务不那么简单:任何显式发送消息的想法有点违背 Haskell 的原则,如果语言过于关注其强大的静态类型(在 Haskell 中通常是这样),工作流的许多方面会变得更加繁琐一个巨大的好处,不仅提高了安全性和性能,而且还使编写更容易)。
我认为以分布式并发方式使用 Haskell 已经不远了,但我们还不能说它在这个角色上已经成熟了。对于分布式并发任务,Erlang 本身当然是要走的路。
集群
老实说,Haskell 在这里根本帮不了你。集群原则上当然是分布式设置的一种特殊情况,因此您可以使用 Cloud Haskell;但在实践中,需求是非常不同的。今天的 HPC 世界(可能在未来相当长的一段时间内)依赖于 MPI,尽管 there is a bit of existing work on MPI bindings,我还没有发现它们可用,至少不是像那样。
MPI 肯定也完全违背了 Haskell 的原则,它的面向 FORTRAN 的数组中心主义、处理类型的奇怪方式等等。但是,除非您对 Haskell 的酷炫功能感到疯狂(尽管它通常如此很诱人!),否则您没有理由不能在 Haskell 中编写典型的数字运算代码。唯一的问题是支持/成熟度,但这是一个相当大的问题;所以对于集群计算,我推荐使用 C++、Python 或 Julia。
一个有趣的替代方法是从 Haskell 生成 MPI 并行化的 C 或 C++ 代码。 Paraiso 是一个很好的项目。
梦想成真
我经常想到在惯用的 Haskell 中可以做些什么来使分布式计算变得可行。 原则上我相信懒惰在这方面可能会有很大的帮助。我设想的模型是让所有机器独立计算相同的程序,但利用 Haskell 评估通常没有预定顺序的事实。该顺序将在每台机器上随机化。此外,运行时将跟踪某个计算分支完成所需的时间,以及结果有多大。如果一个结果被认为既昂贵又紧凑,足以保证它的有效性,那么它将被广播到其他节点,以及一些合适的散列,使它们能够简化计算。
这样的系统永远不会像手动优化的 MPI 应用程序那样高效,但它至少可以在许多情况下提供相同的渐近性。它可以轻松处理复杂得多的算法。
但是,这完全只是我对不远的未来的模糊希望。
†你说 concurrency (这不是关于计算,而是关于 interaction),但似乎你的问题本质上是关于纯计算?