2012-09-10 26 views

Respuesta

18

para estar seguro de la conducta del compilador, prefieren:

[ product | x <- [2, 5, 10] 
      , y <- [8, 10, 11] 
      , let product = x * y 
      , product > 50] 
+0

Esto es mucho más limpio de todos modos. – GManNickG

21

Sería calcular dos veces menos que se produzca la eliminación de subexpresiones comunes.

Dependiendo de la alineación y su nivel de optimización, GHC puede hacer cosas bastante agresivas con la lista de comprensión.

En general, debe compartir explícitamente expresiones comunes para garantizar el intercambio.

7

Buscando en el núcleo cuando se compila con -O2 opción se ha siguiente líneas (pertinentes y simplificados)

  case (y_aAD * sc_s1Rq) > 50 of 
      False -> go_XB2 sc1_s1Rr; 
      True -> (y_aAD * sc_s1Rq):(go_XB2 sc1_s1Rr) 

Esto muestra claramente que la multiplicación se calcula dos veces, por lo que es mejor uso expresión común para evitar recálculo .

Cuestiones relacionadas