2012-04-15 4 views
5

parは次のように宣言されています。 parを使用するには、同じ表現を複数回使用するようなトリックを演奏する必要があります。ハスケル:なぜ `par`が定義されていたのですか?</p> <pre><code>par :: a -> b -> b </code></pre> <p>お知らせ、1が捨てられ、その引数:

その目的は、並列に及びBを実行する場合は、理由は、それがこのように定義されていなかった?:

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

(未評価の)式のタプルを取り、同じ表現を返す - それらはあるが潜在的にバックグラウンドスレッドで実現されています。

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

+2

に怠惰な計算を回し、並列に効果で を評価するために潜在的にプロFiのテーブルとして怠惰 計算に注釈を付けるためのメカニズムとして考案されました。あなたがパーに渡すペアは評価されないかもしれません。誰がそれをいつ評価しますか? – augustss

答えて

8

前者では、簡単に、後者ではなく面倒であろうつ以上の計算、

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

を刺激することができます。

+0

後者には最大8個のargsのオーバーロードがあり、リストバージョンもあります。 – usr

+0

あなたの例のc4だけが生き残ることを意味する引数1が投げ捨てられていることに注意してください。 – usr

+0

どのようにそれをオーバーロードしますか? 'class par a where'と最大8タプルのインスタンス?ああ。 –

7

お勧めtupledバージョンはタイプで、Control.Parallel.StrategiesにparTuple2として見つけることができます:パーパーは「より高いレベルで、そのように設計された理由については

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

」、彼らはクイックソートを並列化Real World Haskellを議論の章24、よう:

我々のコードにこれらの変更は、当社が を必要としていないすべてのもののために顕著です 言う。

  • 使用するコア数。
  • お互いに通信するスレッドは何ですか。
  • 利用可能なコア間で作業を分割する方法。
  • どのデータがスレッド間で共有され、どのデータがプライベートであるか。
  • すべての参加者がいつ終了するかを決定する方法。 A Monad for Deterministic Parallelism、マーロー、ニュートン、そしてペイトン・ジョーンズの書き込みで

:それ は遅延評価と先物との間の重複を生かしたので

パーオペレータは、魅力的な言語設計です。 遅延評価を実装するには、まだ評価されていないが値が の後に要求される 式の表現が必要です。同様に未来は、値が並行して評価されており、待つかもしれない計算である。 はしたがって、パーは私が考えるようにあなたのバージョンがより困難に見つける将来

関連する問題

 関連する問題