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 错误报告。在阅读有关SPECIALIZERULE. 我的specialize 签名确实不像原来的那样多态,而且它满足“if-and-only-if”规则

4

1 回答 1

3

用。。。来代替

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

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

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

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

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

于 2013-11-07T06:49:53.767 回答