Стратегия оценки

Как следует рассуждать об оценке функции в примерах вроде следующего в Haskell:

let f x = ...
    x = ...
in map (g (f x)) xs

В GHC, иногда (fx) оценивается только один раз, а иногда один раз для каждого элемента в xs , в зависимости от того, какие именно f и g . Это может быть важно, когда f x - дорогостоящее вычисление. Это только что сбило с толку новичка в Haskell, которому я помогал, и я не знал, что ему сказать, кроме того, что это зависит от компилятора. Есть ли лучший вариант?

Обновление

В следующем примере (f x) будет оцениваться 4 раза:

let f x = trace "!" $ zip x x
    x = "abc"
in map (\i -> lookup i (f x)) "abcd" 
21
задан Grzegorz Chrupała 25 February 2012 в 00:00
поделиться