2012-04-15 19 views
5

par jest zadeklarowana jako:Haskell: Dlaczego `par` zdefiniowano tak, jak było?

par :: a -> b -> b 

odnotować, że jednym argumentem jest wyrzucane. Aby użyć par, musisz grać w sztuczki, jak wielokrotnie używać tego samego wyrażenia.

Jeśli jego celem jest wykonanie A i B, równolegle, dlatego nie jest określona w ten sposób ?:

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

Biorąc krotkę (unevaluated) wyrażenia i powrocie tych samych wyrażenia - gdy są potencjalnie zmaterializowany na wątkach tła.

Wygląda na to, że ten drugi model jest prostszy od pierwszego. Dlaczego wybrano ten sposób projektowania?

+2

znajdę swoją wersję trudniej myśleć. Para, którą przekażesz paru, może być niedoszacowana. Kto ocenia to i kiedy? – augustss

Odpowiedz

8

W pierwszym, można łatwo wywołać więcej niż dwa obliczenia,

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

co byłoby dość kłopotliwe w tym ostatnim.

+0

Te ostatnie mogą być przeciążone nawet do 8 argumentów i mają również wersję listową. – usr

+0

Zauważ, że ten argument jest odrzucany, co oznacza, że ​​tylko c4 z twojego przykładu przetrwa (bez dalszych sztuczek). – usr

+0

Jak byś go przeciążył? 'class par a where' i instances for to 8-tchles? Ugh. –

7

tupled wersja proponujesz można znaleźć jako parTuple2 w Control.Parallel.Strategies, z rodzaju:

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

Jak, dlaczego par został zaprojektowany w ten sposób, par jest „wyższy poziom ”, jak w rozdziale 24 Real World Haskell omawia, gdzie parallelize się quicksort:

te zmiany do naszego kodu są godne uwagi dla wszystkich rzeczy, które nie potrzebnych powiedzieć.

  • Ile rdzeni użyć.
  • Co wątki zrobić, aby się ze sobą komunikować.
  • Jak podzielić pracę między dostępne rdzenie.
  • Jakie dane są współużytkowane przez wątki i które są prywatne.
  • Jak ustalić, kiedy wszyscy uczestnicy są skończeni.

W A Monad for Deterministic Parallelism, Marlow, Newton i Peyton Jones napisz:

Operator par jest atrakcyjny design język ponieważ aktywuje na nakładanie się leniwe oceny i futures. Aby zaimplementować leniwą ocenę, musimy mieć reprezentację dla wyrażenia , które nie zostały jeszcze ocenione, ale których wartość może później zostać zażądana; i podobnie przyszłość to obliczenie, którego wartość jest oceniana równolegle i na którą możemy czekać. Stąd par został pomyślany jako mechanizm adnotacji leniwe obliczeń jako potencjalnie pro stół fi ocenić równolegle w efekcie obracając leniwe obliczenia w przyszłym