可以通过newtype包装看到融合吗?

fho*_*fho 20 optimization haskell fusion

鉴于:

newtype MyVec = MyVec { unVec :: Data.Vector } 
  deriving (Functor, etc)
Run Code Online (Sandbox Code Playgroud)

这将创建(类似)这个:

instance Functor MyVec where
  fmap f = MyVec . Data.Vector.fmap f . unVec
Run Code Online (Sandbox Code Playgroud)

Vector Vectors融合规则会被激活并重fmap f . fmap g $ myVec写成fmap (f . g) myVec

我应该注意哪些陷阱?在GHC 7.8中解决了为容器中的新类型"支付"的问题,是吗?

Don*_*art 17

融合规则对功能起作用,而不是在类型上.您在MyVec上的函数将没有融合规则,除非您编写它们以重用基础规则.

例如

map :: (a -> b) -> MyVec a -> MyVec b
map f = MyVec . Vector.map f . unVec
{-# INLINE map #-}
Run Code Online (Sandbox Code Playgroud)

那我们就有了用途:

map f . map g
Run Code Online (Sandbox Code Playgroud)

将内联到:

MyVec . Vector.map f . unVec . MyVec . Vector.map g . unVec
Run Code Online (Sandbox Code Playgroud)

然后GHC应该删除newtype构造函数,产生适合融合的常规流:

MyVec . Vector.map f . Vector.map g . unVec
Run Code Online (Sandbox Code Playgroud)

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

  • 第二个问题:通用新类型派生代码会自动内联吗?另外,如何将`INLINE`(或更好的`INLINABLE??)pragma附加到派生类型类? (2认同)