Forall'd约束不受RULE约束lhs

cro*_*eea 5 haskell pragma ghc

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"
Run Code Online (Sandbox Code Playgroud)

无法编译(GHC 7.6.2),因为

Forall'd constraint `Foo m' is not bound in RULE lhs.

谷歌搜索只发现了几年前的几个GHC错误报告.在阅读SPECIALIZE或关注时,我没有看到任何关于"forall'd constraints"的内容RULE.我的特殊签名确实看起来比原始签名更少,并且它满足"if-and-only-if"规则.

Phi*_* JF 3

用。。。来代替

{-# SPECIALIZE f :: (Num (Phantom m)) => Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
Run Code Online (Sandbox Code Playgroud)

它会起作用的。in不是,因此您无法添加约束r。这是合乎逻辑的——并不意味着你可以在开放世界假设下获得其他实例。Num rPhantom mmNum mNum (Phantom m)Num m

编辑:在这种情况下你实际上根本不需要任何约束

{-# SPECIALIZE f :: Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
Run Code Online (Sandbox Code Playgroud)

无论如何,如果我理解您想要做的事情,基本问题是当您基于幻像类型参数执行优化时无法进行约束。