5

この問題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 つしか見つかりませんでした。SPECIALIZEorについて読んでいる間、「forall'd 制約」について何も見ませんでしたRULE。私の Specialize シグネチャはオリジナルよりも多態的ではないように見え、「if-and-only-if」ルールを満たしています。

4

1 に答える 1