Haskell fusion能看穿新型包装吗?

Haskell fusion能看穿新型包装吗?,haskell,optimization,fusion,Haskell,Optimization,Fusion,鉴于: 这将创建(类似)以下内容: 向量融合规则将触发并重写fmap f。fmap g$myVec转换成fmap(f.g)myVec 有什么我应该注意的陷阱吗?您看,GHC 7.8解决了您为容器中的新类型“付费”的问题,是吗?融合规则对函数而不是类型进行操作。MyVec上的函数不会有融合规则,除非编写它们以重用底层规则 例如 那么我们就有了用途: map :: (a -> b) -> MyVec a -> MyVec b map f = MyVec . Vector.map f

鉴于:

这将创建(类似)以下内容:

向量融合规则将触发并重写
fmap f。fmap g$myVec
转换成
fmap(f.g)myVec


有什么我应该注意的陷阱吗?您看,GHC 7.8解决了您为容器中的新类型“付费”的问题,是吗?

融合规则对函数而不是类型进行操作。MyVec上的函数不会有融合规则,除非编写它们以重用底层规则

例如

那么我们就有了用途:

map :: (a -> b) -> MyVec a -> MyVec b
map f = MyVec . Vector.map f . unVec
{-# INLINE map #-}
它将内联到:

map f . map g
然后GHC应删除新类型构造函数,生成适合融合的规则流:

MyVec . Vector.map f . unVec . MyVec . Vector.map g . unVec
您可以通过运行GHC并查看重写规则来确认这一点。
或者,您可以添加自己的“MyVec.unVec”重写规则,但GHC应该已经涵盖了这一点。

声明“
newtype
s不需要任何费用”。如果它们确实阻止了某些优化,那么它不应该被重写吗?
map
的定义不应该在其中调用
MyVec
,例如“map fx=MyVec$Vector.map f(unVec x)”?第一个问题:我如何找到相关的重写规则。当我使用
-ddump规则触发时
我看到数千次触发。。。第二个问题:泛型新类型派生代码是否会自动内联?否则,如何将
INLINE
(或者更好的
inlineable
?)杂注附加到派生类型类?
map f . map g
MyVec . Vector.map f . unVec . MyVec . Vector.map g . unVec
MyVec . Vector.map f . Vector.map g . unVec