Как следует рассуждать об оценке функции в примерах вроде следующего в 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"