Forall'd约束不受RULE约束lhs

时间:2013-11-07 06:46:51

标签: haskell ghc pragma

在尝试找到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

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

1 个答案:

答案 0 :(得分:3)

替换为

{-# SPECIALIZE f :: (Num (Phantom m)) => Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}

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

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

{-# SPECIALIZE f :: Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}

无论如何,如果我理解你要做什么的基本问题是你在基于幻像类型参数执行优化时不能限制。