INLINE Pragma в сочетании с типом классов - PullRequest
7 голосов
/ 29 марта 2012

Учитывая следующий код (скопированный из библиотеки attoparsec), что делает встроенная прагма?Я полагаю, что имеет смысл встраивать только fmapR, но не другие fmap, которые определены в других экземплярах Functor.

instance Functor (IResult t) where
    fmap = fmapR
    {-# INLINE fmap #-}

1 Ответ

4 голосов
/ 29 марта 2012

Встроенная прагма скопирует содержимое функции (в данном случае fmapR) в место, где она вызывается, если компилятор может доказать, что используемый функтор равен IResult.

Функция не может быть встроена в следующем случае, поскольку определение fmap неизвестно:

f :: Functor f => f Int -> f Float
f = fmap fromIntegral

Здесь, однако, это известно, потому что используется определенный функтор, и функция может быть встроенной:

f :: IResult Int -> IResult Float
f = fmap fromIntegral
-- rewritten to: f = fmapR fromIntegral; might be further inlined
...