У меня есть эта функция (создает последовательность Фибоначчи):
unfoldr (\(p1, p2) -> Just (p1+p2, (p1+p2, p1)) ) (0, 1)
Здесь я заметил повторяющееся выражение p1+p2
, которое я хотел бы вычислить так, чтобы оно вычислялось только один раз.Само дополнение не является дорогим вычислением, но для более общей версии:
unfoldr (\(p1, p2) -> Just (f p1 p2, (f p1 p2, p1)) ) (0, 1)
where f = arbitrary, possibly time-consuming function
В описанной выше ситуации f p1 p2
рассчитывается дважды (если не существует какой-то волшебной оптимизации компилятора, о которой я не знаю), что может создать узкое место в производительности, если f
требует много вычислений.Я не могу включить f p1 p2
в where
, потому что p1
и p2
не входят в сферу применения.Каков наилучший способ вычислить это выражение так, чтобы f
вычислялось только один раз?