Как следует рассуждать об оценке функций в примерах, подобных приведенным в Haskell:
let f x = ...
x = ...
in map (g (f x)) xs
В GHC иногда (f x)
оценивается только один раз, а иногда и один раз для каждого элемента в 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"