提案する3倍のバージョンは、Control.Parallel.StrategiesのparTuple2として、次のタイプで見つけることができます。
evalTuple2 :: Strategy a -> Strategy b -> Strategy (a, b)
パーがそのように設計された理由については、 Real World Haskellの第24章で説明されているように、パーは「より高いレベル」であり、クイックソートと並列化されています。
私たちのコードに対するこれらの変更は、私たちが言う必要のないすべてのことで注目に値します。
- 使用するコアの数。
- スレッドが相互に通信するために行うこと。
- 利用可能なコア間で作業を分割する方法。
- どのデータがスレッド間で共有され、どのデータがプライベートであるか。
- すべての参加者がいつ終了したかを判断する方法。
決定論的並列性のモナドで、Marlow、Newton、およびPeytonJonesは次のように書いています。
パー演算子は、遅延評価と先物の重複を利用するため、魅力的な言語設計です。遅延評価を実装するには、まだ評価されていないが、後で値が要求される可能性のある式の表現が必要です。同様に、futureは、値が並行して評価され、待機する可能性のある計算です。したがって、parは、レイジー計算を並行して評価するのに潜在的に有益であるとして、レイジー計算に注釈を付けるためのメカニズムとして考えられ、事実上、レイジー計算を未来に変えます。