2012-04-15 11 views
5

par è dichiarato come:Haskell: Perché "par" è stato definito così com'era?

par :: a -> b -> b 

avviso, tale argomento si è gettato via. Per usare il par devi giocare trucchi come usare la stessa espressione più volte.

se il suo scopo è quello di eseguire un e b in parallelo, perché non è vero definito come questo ?:

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

Facendo una tupla di espressioni (non valutate) e restituendo le stesse espressioni - mentre sono potenzialmente materializzato su thread in background.

Sembra che quest'ultimo modello sia più semplice del precedente. Perché il design è stato scelto in questo modo?

+2

trovo la versione più difficile da pensare. La coppia che passi al par potrebbe non essere stata valutata. Chi lo valuta e quando? – augustss

risposta

8

Nel primo, si può facilmente innescare più di due calcoli,

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

che sarebbero piuttosto ingombrante in quest'ultimo.

+0

Quest'ultimo potrebbe essere sovraccaricato per un massimo di 8 arg e avere anche una versione di elenco. – usr

+0

Notate che l'argomento uno è buttato via, il che significa che solo c4 dal vostro esempio sopravviverà (senza ulteriori trucchi). – usr

+0

Come lo sovraccaricheresti? 'class par a where' e istanze per un massimo di 8-tuple? Ugh. –

7

La versione tupled suggerisci può essere trovato come parTuple2 in Control.Parallel.Strategies, con il tipo:

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

Per quanto riguarda il motivo per cui par è stato progettato in questo modo, par è 'livello superiore ', come il capitolo 24 del Real World Haskell discute, dove parallelizzare un Quicksort:

Questi cambiamenti al nostro codice sono notevoli per tutte le cose che abbiamo non necessari dire.

  • Quanti core utilizzare.
  • Quali thread devono comunicare tra loro.
  • Come suddividere il lavoro tra i core disponibili.
  • Quali dati sono condivisi tra thread e privati.
  • Come determinare quando tutti i partecipanti sono terminati.

In A Monad for Deterministic Parallelism, Marlow, Newton, e Peyton Jones scrittura:

L'operatore par è un design lingua interessante perché sfrutta la sovrapposizione tra la valutazione pigra e futures. Per implementare la valutazione lazy, è necessario avere una rappresentazione per le espressioni che non sono ancora state valutate ma il cui valore può essere richiesto in seguito ; e allo stesso modo un futuro è un calcolo il cui valore viene valutato in parallelo e che potremmo aspettare. Quindi, par è stato concepito come un meccanismo per annotare un pigro computazione come tavolo fi potenzialmente pro di valutare in parallelo, in effetti trasformare un calcolo pigro in un futuro