9

这是Learn you a Haskell中的一个例子:

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

那么,这里发生了什么,会x*y计算两次还是一次呢?

4

3 回答 3

21

除非发生公共子表达式消除,否则它将计算两次。

根据内联和您的优化级别,GHC 可能会对列表理解做一些非常激进的事情。

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

于 2012-09-10T15:43:07.433 回答
19

为了确定编译器的行为,更喜欢:

[ product | x <- [2, 5, 10]
          , y <- [8, 10, 11]
          , let product = x * y
          , product > 50] 
于 2012-09-10T15:42:51.087 回答
7

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

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

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

于 2012-09-10T16:22:14.577 回答