Почему GHC рассматривает LHS *синтаксически *при встраивании?

Согласно документам GHC :

...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)

Мои вопросы:

  1. Только ли при наличии прагм INLINE мы получаем эту строгую поведение (т. е. строгое синтаксическое представление LHS, RHS встроено без / вне оптимизация )?

  2. когда прагмы INLINE не заданы, GHC когда-либо преобразует функцию как от comp2до comp1?

  3. если нет, то почему? Не слишком ли сложно вообще компилятору посмотреть в семантике функции и решить, сколько и где частично -применяются и INLINE?

  4. что произойдет, если GHC просто превратит все функции в каскад выражений let... inс лямбда-выражениями и без привязок к ЛХС?

17
задан jberryman 27 July 2012 в 17:17
поделиться