Haskell - 列表理解预测优化

Cam*_*mel 9 haskell

这是了解一下Haskell的一个例子:

ghci> [ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]  
[55,80,100,110]   
Run Code Online (Sandbox Code Playgroud)

那么,这里发生了什么,将x*y被计算两次或一次?

Don*_*art 21

除非发生共同的子表达式消除,否则将计算两次.

根据内联和优化级别,GHC可能会对列表理解做很积极的事情.

通常,您应该明确地共享常用表达式以保证共享.


m09*_*m09 19

为了确保编译器的行为,首选:

[ product | x <- [2, 5, 10]
          , y <- [8, 10, 11]
          , let product = x * y
          , product > 50] 
Run Code Online (Sandbox Code Playgroud)


Sat*_*vik 7

在使用-O2选项编译时查看核心,它具有以下行(相关和简化)

          case (y_aAD * sc_s1Rq) > 50 of 
            False -> go_XB2 sc1_s1Rr;
            True -> (y_aAD * sc_s1Rq):(go_XB2 sc1_s1Rr)
Run Code Online (Sandbox Code Playgroud)

这清楚地表明乘法计算两次,因此最好使用通用表达式来防止重新计算.