2012-10-12 13 views
11

considerare le seguenti due affermazioni:riguardo 'pseq' in Haskell

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

e

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

qualcuno può spiegare come il loro comportamento differiscono gli uni dagli altri?

Per il primo, se il thread principale ha eseguito il calcolo b ma lo scintillio a non è terminato, il thread principale procederà al calcolo a + b?

risposta

12

par a b è semanticamente equivalente a b, ma dà il suggerimento che potrebbe essere utile iniziare a valutare a in anticipo. D'altro canto, pseq forza la valutazione del suo primo argomento, ma è semplicemente la funzione di identità (pigra) nel suo secondo argomento.

Quindi,

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

è semanticamente equivalente a

b `pseq` (a + b) 

che equivale a

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

in quanto entrambi dire "valutare b poi diventare il thunk a + b". Data la non precisione delle conseguenze di par, nessuna altra differenza può essere evidenziata dalla definizione della lingua. Piuttosto, sul tuo particolare compilatore/runtime potrebbero fare cose leggermente diverse.