5

par次のように宣言されます:

par  :: a -> b -> b

引数1が破棄されていることに注意してください。パーを使用するには、同じ式を複数回使用するなどのトリックを実行する必要があります。

aとbを並行して実行することが目的である場合、なぜこのように定義されなかったのでしょうか。

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

(未評価の)式のタプルを取得し、同じ式を返します-バックグラウンドスレッドで具体化される可能性があります。

後者のモデルは前者よりも単純なようです。なぜそのようにデザインが選ばれたのですか?

4

2 に答える 2

8

前者では、2 つ以上の計算を簡単に開始できます。

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

後者ではかなり面倒です。

于 2012-04-15T22:21:40.063 に答える
7

提案する3倍のバージョンは、Control.Parallel.StrategiesのparTuple2として、次のタイプで見つけることができます。

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

パーがそのように設計された理由については、 Real World Haskellの第24章で説明されているように、パーは「より高いレベル」であり、クイックソートと並列化されています。

私たちのコードに対するこれらの変更は、私たちが言う必要のないすべてのことで注目に値します。

  • 使用するコアの数。
  • スレッドが相互に通信するために行うこと。
  • 利用可能なコア間で作業を分割する方法。
  • どのデータがスレッド間で共有され、どのデータがプライベートであるか。
  • すべての参加者がいつ終了したかを判断する方法。

決定論的並列性のモナドで、Marlow、Newton、およびPeytonJonesは次のように書いています。

パー演算子は、遅延評価と先物の重複を利用するため、魅力的な言語設計です。遅延評価を実装するには、まだ評価されていないが、後で値が要求される可能性のある式の表現が必要です。同様に、futureは、値が並行して評価され、待機する可能性のある計算です。したがって、parは、レイジー計算を並行して評価するのに潜在的に有益であるとして、レイジー計算に注釈を付けるためのメカニズムとして考えられ、事実上、レイジー計算を未来に変えます。

于 2012-04-16T10:12:56.243 に答える