Haskell:为什么`par`定义它的方式?

时间:2012-04-15 22:18:06

标签: multithreading haskell parallel-processing par

par声明为:

par  :: a -> b -> b

注意,那个论点被抛弃了。为了使用par,你需要多次使用同一个表达式。

如果它的目的是并行执行a和b,为什么它不是这样定义的?:

par  :: (a, b) -> (a, b)

获取(未评估的)表达式的元组并返回相同的表达式 - 虽然它们可能在后台线程上实现。

似乎后者的模型比前者更简单。为什么选择这样的设计?

2 个答案:

答案 0 :(得分:8)

在前者中,你可以轻松地激发两次以上的计算,

c1 `par` c2 `par` c3 `par` c4 `pseq` something c1 c2 c3 c4

后者会相当麻烦。

答案 1 :(得分:7)

您建议的tupled版本可以在Control.Parallel.Strategies中找到parTuple2,类型为:

evalTuple2 :: Strategy a -> Strategy b -> Strategy (a, b)

至于为什么 par 是这样设计的, par 是'更高级别',正如Real World Haskell的第24章所讨论的那样,他们将快速排序并行化:

  

对于我们所拥有的所有内容,我们代码的这些更改都非常出色     不用说了。

     
      
  • 要使用多少个核心。
  •   
  • 哪些线程可以相互通信。
  •   
  • 如何在可用核心之间划分工作。
  •   
  • 哪些数据在线程之间共享,哪些是私有的。
  •   
  • 如何确定所有参与者何时完成。
  •   

A Monad for Deterministic Parallelism,Marlow,Newton和Peyton Jones写道:

  

par运营商是一个有吸引力的语言设计,因为它   利用懒惰评估和期货之间的重叠。   要实现惰性评估,我们必须有一个表示   尚未评估但其值可能的表达式   后来被要求;同样,未来是一种计算   价值正在被平行评估,我们可能会等待。   因此,par被认为是一种注释懒惰的机制   计算作为潜在的平行评估表,   实际上将懒惰的计算转变为未来