2012-09-10 72 views
9

這是一個例子,從瞭解你的Haskell:哈斯克爾 - 列表綜合謂詞優化

ghci> [ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50] 
[55,80,100,110] 

因此,這裏發生了什麼,都會x*y兩次或一次計算的?

+6

這取決於編譯器。 – augustss

+4

爲了給另一個IMO更好的Haskell比Mog的替代方案,考慮 'filter(> 50)[x * y | x < - [2,5,10],y < - [8,10,11]]' – leftaroundabout

回答

18

可以肯定的編譯器的行爲,寧願:

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

無論如何,這是非常清潔的。 – GManNickG

21

除非公共子表達式消除發生時會被重複計算。

根據內聯和您的優化級別,GHC可能會在列表理解方面做相當積極的事情。

通常,您應該明確地共享通用表達式以保證共享。

7

尋找到芯時-O2選項編譯它具有以下(相關和簡化的)線

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

這清楚地表明,該乘法計算兩次,所以最好是使用共同表達,以防止重新計算。