Given:
newtype MyVec = MyVec { unVec :: Data.Vector }
deriving (Functor, etc)
这将创建(类似于):
instance Functor MyVec where
fmap f = MyVec . Data.Vector.fmap f . unVec
向量融合规则会触发并重写吗fmap f . fmap g $ myVec
into fmap (f . g) myVec
?
有什么我应该注意的陷阱吗?哎呀,你为新类型的容器“付费”的问题在 GHC 7.8 中得到了解决,不是吗?
融合规则作用于函数,而不是类型。 MyVec 上的函数不会有融合规则,除非您编写它们来重用底层规则。
E.g.
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 应该已经涵盖了这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)