...GHC will only inline the function if it is fully applied, where "fully applied" means applied to as many arguments as appear (syntactically) on the LHS of the function definition.
Если приведенный пример представляет собой два семантически -эквивалентных определения:
comp1 :: (b -> c) -> (a -> b) -> a -> c
{-# INLINE comp1 #-}
comp1 f g = \x -> f (g x)
comp2 :: (b -> c) -> (a -> b) -> a -> c
{-# INLINE comp2 #-}
comp2 f g x = f (g x)
Мои вопросы:
Только ли при наличии прагм INLINE мы получаем эту строгую поведение (т. е. строгое синтаксическое представление LHS, RHS встроено без / вне оптимизация )?
когда прагмы INLINE не заданы, GHC когда-либо преобразует функцию как от comp2
до comp1
?
если нет, то почему? Не слишком ли сложно вообще компилятору посмотреть в семантике функции и решить, сколько и где частично -применяются и INLINE?
что произойдет, если GHC просто превратит все функции в каскад выражений let... in
с лямбда-выражениями и без привязок к ЛХС?