この問題SPECIALIZE
の解決策を見つけようとしているときに、プラグマをいじっています。
私はこの例を思いつきました:
{-# 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
.
グーグルで検索しても、数年前の GHC バグ レポートが 2 つしか見つかりませんでした。SPECIALIZE
orについて読んでいる間、「forall'd 制約」について何も見ませんでしたRULE
。私の Specialize シグネチャはオリジナルよりも多態的ではないように見え、「if-and-only-if」ルールを満たしています。