haskell - Can fusion see through newtype wrappers? -


given:

newtype myvec = myvec { unvec :: data.vector }    deriving (functor, etc) 

this create (something like) this:

instance functor myvec   fmap f = myvec . data.vector.fmap f . unvec 

will vectors fusion rules fire , rewrite fmap f . fmap g $ myvec fmap (f . g) myvec?

are there pitfalls should aware of? afaik problem "pay" new types in containers solved in ghc 7.8, it?

fusion rules operate on functions, not on types. functions on myvec won't have fusion rules, unless write them reuse underlying ones.

e.g.

map :: (a -> b) -> myvec -> myvec b map f = myvec . vector.map f . unvec {-# inline map #-} 

then we'd have uses:

map f . map g 

which inline to:

myvec . vector.map f . unvec . myvec . vector.map g . unvec 

ghc should erase newtype constructor, yielding regular stream, suitable fusion:

myvec . vector.map f . vector.map g . unvec 

you can confirm running ghc , looking @ rewrite rules firing. alternatively, can add own "myvec. unvec" rewrite rule, ghc should cover that.


Comments

Popular posts from this blog

java - Oracle EBS .ClassNotFoundException: oracle.apps.fnd.formsClient.FormsLauncher.class ERROR -

c# - how to use buttonedit in devexpress gridcontrol -

nvd3.js - angularjs-nvd3-directives setting color in legend as well as in chart elements -