对SPECIALIZE pragma的误解

err*_*rom 8 haskell compiler-warnings ghc

SPECIALIZE编译指示的目的是创建更具体的函数版本.

我有一个功能

adaptBlocks :: Int -> BlocksField a -> Maybe (BlocksField a)
Run Code Online (Sandbox Code Playgroud)

我把它专门化如下:

{-# SPECIALIZE NOINLINE
    adaptBlocks :: Int -> BlocksField Element -> Maybe (BlocksField Element) #-}
Run Code Online (Sandbox Code Playgroud)

但编译器给了我这个令人困惑的警告:

SPECIALISE pragma for non-overloaded function ‘adaptBlocks’
Run Code Online (Sandbox Code Playgroud)

怎么了?

chi*_*chi 10

专业化适用于有界多态,其中类型变量如a受约束,例如

foo :: (Eq a, Num a) => a -> a -> a
foo x y | x == y    = 2*x
        | otherwise = 3*y 
Run Code Online (Sandbox Code Playgroud)

在这里,specializing a ~ Int允许编译器内联Int版本(==),(*),提高效率.请注意,此类函数由上下文提供(Eq a, Num a).

在您的情况下,没有约束的上下文a,因此无法执行此优化.在您的所有多态代码都无法使用(*)或任何其他数字函数之后Int,因为为了编译,您的代码必须处理任何类型a,包括那些不是数字的类型.