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应该已经涵盖了这一点.
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |