Многие компиляторы функционального языка программирования имеют проход Lambda Lifting, и мне интересно, это лучший способ реализовать функциональный язык программирования?
Давайте рассмотрим следующий пример:
foo :: Int -> Int -> Int
foo = \x -> \y -> x * x * x + y
main = print $ sum (map (foo 5) [0..100])
если без лямбда-лифтинга нам нужно рассчитать x * x * x
только 1 раз, но если с лямбда-лифтингом нам нужно будет вычислить x * x * x
100 раз.
Так что мне интересно, всегда ли GHC делал лямбда-лифтинг даже в вышеупомянутом случае? это необходимо? Или есть какая-нибудь альтернативная технология компиляции FP lang, которая может лучше справиться с вышеуказанным случаем?