2012-10-12 62 views
11

Considere los siguientes dos declaraciones:sobre 'PSEQ' en Haskell

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

y

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

Puede alguien explicar cómo su comportamiento difiere de unos a otros?

Para el primero, si el hilo principal se ha hecho con el cálculo de b pero la chispa de computación a no ha terminado, será el hilo principal procederá a calcular a + b?

Respuesta

12

par a b es semánticamente equivalente a b, pero da la pista de que podría ser útil comenzar a evaluar a temprano. Por otro lado, pseq fuerza la evaluación de su primer argumento, pero es simplemente la función de identidad (floja) en su segundo argumento.

Así,

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

es semánticamente equivalente a

b `pseq` (a + b) 

lo que equivale a

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

en que el tanto decir "evaluar b convertirá entonces en el golpe seco a + b". Dada la falta de precisión en las consecuencias de par, no puede distinguirse ninguna otra diferencia de la definición de idioma. Por el contrario, en su compilador/tiempo de ejecución particular, pueden hacer cosas ligeramente diferentes.

Cuestiones relacionadas