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"规则.
用。。。来代替
{-# SPECIALIZE f :: (Num (Phantom m)) => Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
Run Code Online (Sandbox Code Playgroud)
它会起作用的。in不是,因此您无法添加约束r
。这是合乎逻辑的——并不意味着你可以在开放世界假设下获得其他实例。Num r
Phantom m
m
Num m
Num (Phantom m)
Num m
编辑:在这种情况下你实际上根本不需要任何约束
{-# SPECIALIZE f :: Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
Run Code Online (Sandbox Code Playgroud)
无论如何,如果我理解您想要做的事情,基本问题是当您基于幻像类型参数执行优化时无法进行约束。