在尝试找到this problem的解决方案时,我正在弄乱SPECIALIZE
pragma。
我想出了这个例子:
{-# LANGUAGE FlexibleContexts, GeneralizedNewtypeDeriving #-}
import Data.Vector
import qualified Data.Vector.Generic as V
class Foo a
newtype Phantom m = T Int deriving (Show)
instance (Foo m) => Num (Phantom m)
f :: (Num r, V.Vector v r) => v r -> v r -> v r
{-# SPECIALIZE f :: (Foo m) => Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
f x y = V.zipWith (+) x y
main = print "hello"
无法编译(GHC 7.6.2),因为
Forall'd constraint `Foo m' is not bound in RULE lhs
。
SPECIALIZE
或RULE
时,我没有看到任何关于“forall'd constraints”的内容。我的特殊签名确实看起来比原始签名更少,并且它满足"if-and-only-if" rule。
答案 0 :(得分:3)
替换为
{-# SPECIALIZE f :: (Num (Phantom m)) => Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
它会起作用。 r
中的Num r
为Phantom m
而不是m
,因此您无法添加约束Num m
。这是合乎逻辑的 - Num (Phantom m)
并不意味着Num m
,你可以在开放世界的假设下获得其他实例。
编辑: 在这种情况下,你实际上根本不需要任何约束
{-# SPECIALIZE f :: Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
无论如何,如果我理解你要做什么的基本问题是你在基于幻像类型参数执行优化时不能限制。