這是一個例子,從瞭解你的Haskell:哈斯克爾 - 列表綜合謂詞優化
ghci> [ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]
[55,80,100,110]
因此,這裏發生了什麼,都會x*y
兩次或一次計算的?
這是一個例子,從瞭解你的Haskell:哈斯克爾 - 列表綜合謂詞優化
ghci> [ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]
[55,80,100,110]
因此,這裏發生了什麼,都會x*y
兩次或一次計算的?
可以肯定的編譯器的行爲,寧願:
[ product | x <- [2, 5, 10]
, y <- [8, 10, 11]
, let product = x * y
, product > 50]
無論如何,這是非常清潔的。 – GManNickG
除非公共子表達式消除發生時會被重複計算。
根據內聯和您的優化級別,GHC可能會在列表理解方面做相當積極的事情。
通常,您應該明確地共享通用表達式以保證共享。
尋找到芯時-O2選項編譯它具有以下(相關和簡化的)線
case (y_aAD * sc_s1Rq) > 50 of
False -> go_XB2 sc1_s1Rr;
True -> (y_aAD * sc_s1Rq):(go_XB2 sc1_s1Rr)
這清楚地表明,該乘法計算兩次,所以最好是使用共同表達,以防止重新計算。
這取決於編譯器。 – augustss
爲了給另一個IMO更好的Haskell比Mog的替代方案,考慮 'filter(> 50)[x * y | x < - [2,5,10],y < - [8,10,11]]' – leftaroundabout