В соответствии с GHC docs:
... GHC будет только встроить функцию, если она будет полностью применена, где "полностью примененные" средства применяются к множеству аргументов, которые появляются (синтаксически) на LHS определения функции.
Если приведенный пример представляет собой два семантически эквивалентных определения:
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, оптимизация)?
-
когда не заданы прагмы INLINE, делает ли GHC когда-либо преобразование функции как
comp2
доcomp1
? -
Если нет, то почему? Это слишком сложно вообще для компилятора посмотреть в семантике функции и решить, сколько и где частично применять и INLINE?
-
что произойдет, если GHC просто преобразует все функции в каскад выражений
let... in
с lambdas и отсутствие привязок на LHS?