:Haskellで 'seq'または 'pseq'と 'par'が必要なのはなぜですか?私たちは、標準的なサンプルコードのすべての部分を必要とする理由を理解しようとしてい
a `par` b `pseq` a+b
はなぜ以下は十分ではないのだろうか?
a `par` b `par` a+b
上記の式は、非常にわかりやすいようだ:並列にa
とb
の両方を評価してみて、結果a+b
を返します。効率の理由だけです:2回目のバージョンは1回ではなく2回発火しますか?
次の、より簡潔なバージョンはどうですか?
a `par` a+b
なぜ我々はb
がオリジナル、標準のコードのようにa+b
前に評価されていることを確認する必要があるでしょうか?
これは正しいですし、 'seq'がこの問題には不十分な理由も説明しています。 'seq'は評価の順序付けを保証しません。 'seq b(a + b)'では、主スレッドは '(a + b)'が評価されるときに 'b'がWHNFにある限り、' b'の前に 'a'を評価することができます。 –
私はその引数が 'par a(par b(a + b)) 'の問題をどのように記述しているのかわかりません - 確かに' a'か 'b'のどちらかがすぐに評価され、他のスパークは非常に生きていて、並列性を生み出すはずです。もちろん、スパークの作成は、これを実行する最も効率的な方法ではないかもしれませんが、それは動作し、評価則の質問をコンパイラに任せます。 – gereeter
'par a(a + b)'の場合、実行時に 'b'が最初に選択された場合でも、' 'ラッキー ''の並列化が可能です。それから、 'a'火花が爆発することはありません。これはPDF:community.haskell.org/~simonmar/papers/threadscope.pdf(2ページ)に記載されています。 – CMCDragonkai