Подтвердить что ты не робот

Может ли слияние увидеть через обертки newtype?

Дано:

newtype MyVec = MyVec { unVec :: Data.Vector } 
  deriving (Functor, etc)

Это создаст (что-то вроде этого):

instance Functor MyVec where
  fmap f = MyVec . Data.Vector.fmap f . unVec

Правила слияния V векторов срабатывают и переписывают fmap f . fmap g $ myVec в fmap (f . g) myVec?

Есть ли какие-то подводные камни, о которых я должен знать? Afaik проблема, когда вы "платите" за новые типы в контейнерах, была решена в GHC 7.8, не так ли?

4b9b3361

Ответ 1

Правила Fusion действуют на функции, а не на типы. Ваши функции в MyVec не будут иметь правил слияния, если вы не напишете их, чтобы повторно использовать базовые.

например.

map :: (a -> b) -> MyVec a -> MyVec b
map f = MyVec . Vector.map f . unVec
{-# INLINE map #-}

Тогда мы будем использовать:

map f . map g

который будет встроен в:

MyVec . Vector.map f . unVec . MyVec . Vector.map g . unVec

GHC должен затем удалить конструктор newtype, давая регулярный поток, подходящий для слияния:

MyVec . Vector.map f . Vector.map g . unVec

Вы можете подтвердить это, запустив GHC и посмотрев стрелку правил перезаписи. Кроме того, вы можете добавить свое собственное правило перезаписи MyVec. UnVec, но GHC уже должен его охватить.