1
有约束的专业化
我在让GHC专门化具有类约束的函数时遇到问题。我有我的问题的一个小例子,在这里:Foo.hs和 Main.hs。这两个文件将编译(GHC 7.6.2,ghc -O3 Main)并运行。 注意: Foo.hs真的被剥夺了。如果您想了解为什么需要约束,可以在此处查看更多代码。如果我将代码放在单个文件中或进行许多其他小的更改,GHC只会内联对的调用plusFastCyc。在实际代码中不会发生这种情况,因为plusFastCyc即使GHC标记为,也无法内联INLINE。关键是要专门针对plusFastCyc,而不是内联它。plusFastCyc在实际代码中的很多地方都调用了,因此即使希望强制GHC进行复制,也无法复制这么大的函数。 感兴趣的代码是plusFastCycin Foo.hs,在此处复制: {-# INLINEABLE plusFastCyc #-} {-# SPECIALIZE plusFastCyc :: forall m . (Factored m Int) => (FastCyc (VT U.Vector m) Int) -> (FastCyc (VT U.Vector m) Int) -> (FastCyc (VT U.Vector m) Int) #-} -- Although the next specialization makes `fcTest` fast, …