对SPECIALIZE pragma的误解
Misunderstanding of SPECIALIZE pragma
SPECIALIZE
pragma 的目的是创建更具体的函数版本。
我有一个功能
adaptBlocks :: Int -> BlocksField a -> Maybe (BlocksField a)
我将其专门化如下:
{-# SPECIALIZE NOINLINE
adaptBlocks :: Int -> BlocksField Element -> Maybe (BlocksField Element) #-}
但是编译器给了我这个令人困惑的警告:
SPECIALISE pragma for non-overloaded function ‘adaptBlocks’
怎么了?
专业化适用于有界多态性,其中 a
等类型变量受到约束,例如
foo :: (Eq a, Num a) => a -> a -> a
foo x y | x == y = 2*x
| otherwise = 3*y
在这里,专门化 a ~ Int
允许编译器内联 (==),(*)
的 Int
版本,从而提高效率。请注意,此类功能由上下文 (Eq a, Num a)
.
提供
在你的情况下,不存在约束a
的上下文,因此无法执行此优化。毕竟你的多态代码不能在 Int
上使用 (*)
或任何其他数字函数,因为为了编译,你的代码必须处理任何类型 a
,包括那些不是数字的.
SPECIALIZE
pragma 的目的是创建更具体的函数版本。
我有一个功能
adaptBlocks :: Int -> BlocksField a -> Maybe (BlocksField a)
我将其专门化如下:
{-# SPECIALIZE NOINLINE
adaptBlocks :: Int -> BlocksField Element -> Maybe (BlocksField Element) #-}
但是编译器给了我这个令人困惑的警告:
SPECIALISE pragma for non-overloaded function ‘adaptBlocks’
怎么了?
专业化适用于有界多态性,其中 a
等类型变量受到约束,例如
foo :: (Eq a, Num a) => a -> a -> a
foo x y | x == y = 2*x
| otherwise = 3*y
在这里,专门化 a ~ Int
允许编译器内联 (==),(*)
的 Int
版本,从而提高效率。请注意,此类功能由上下文 (Eq a, Num a)
.
在你的情况下,不存在约束a
的上下文,因此无法执行此优化。毕竟你的多态代码不能在 Int
上使用 (*)
或任何其他数字函数,因为为了编译,你的代码必须处理任何类型 a
,包括那些不是数字的.