Хорошо, так что это меня беспокоило какое-то время, поэтому я подумал, что приду и спрошу кого-нибудь, кто мог бы действительно узнать ответ.
Предположим, что у меня есть следующая функция:
foobar x y = expensive x + cheap y
Предположим, что эта часть программы принимает в качестве входных данных foobar 5
и выполняет эту функцию миллионы раз в замкнутом цикле. Ясно, что я хочу, чтобы expensive 5
вычислялся один раз, а не миллион раз.
Я мог оставить код таким, какой он есть, или я могу изменить его на
foobar x = let k = expensive x in \ y -> k + cheap y
Мне это интересно...
-
Является ли GHC достаточно умным, чтобы устранить дублируемую работу? (I.e., делает ли первая версия то, что я хочу?)
-
Если нет, действительно ли вторая версия исправляет проблему? (I.e., оптимизатор просто преобразует его обратно в тот же код, что и первая версия?)