2012-10-12 3 views
11

die beiden folgenden Anweisungen vor:Über 'pseq' in Haskell

(a `par` b) `pseq` (a + b) 

und

a `par` (b `pseq` (a + b)) 

Kann mir jemand erklären, wie ihr Verhalten voneinander unterscheiden?

Für den ersten, wenn der Haupt-Thread mit der Berechnung b getan hat, aber die Spark Computing a nicht fertig ist, wird der Haupt-Thread fortfahren zu berechnen a + b?

Antwort

12

par a b ist semantisch gleichbedeutend mit b, aber es gibt den Hinweis, dass es nützlich sein könnte, a früh zu bewerten. Auf der anderen Seite erzwingt pseq die Auswertung seines ersten Arguments, ist aber einfach die (faule) Identitätsfunktion in seinem zweiten Argument.

So

(a `par` b) `pseq` (a + b) 

ist semantisch äquivalent zu

b `pseq` (a + b) 

was

a `par` (b `pseq` (a + b)) 

, dass entspricht dem beide sagen "bewerten b dann die Thunk werden a + b". Angesichts der Nichtpräzision in den Folgen von par kann kein anderer Unterschied aus der Sprachdefinition hervorgehen. Vielmehr könnten sie in Ihrem speziellen Compiler/Runtime etwas andere Dinge tun.