Ответ 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 уже должен его охватить.