使用 GHC RULES
pragma,可以为特定类型专门化多态函数。Haskell 报告中的示例:
genericLookup :: Ord a => Table a b -> a -> b
intLookup :: Table Int b -> Int -> b
{-# RULES "genericLookup/Int" genericLookup = intLookup #-}
这将使 GHCintLookup
在整数索引表和通用版本上使用,否则intLookup
可能会更有效。
我想完成类似的事情,使用类似以下(稍微简化)的功能:
lookup :: Eq a => [(a, b)] -> a -> b
lookupOrd :: Ord a => [(a, b)] -> a -> b
where从输入列表中lookupOrd
创建 aMap
然后使用Map.lookup
,这要求它a
是 的成员Ord
。
现在我想告诉 GHClookupOrd
应该使用lookup
什么时候代替a
确实是Ord
类型类的成员。但是,以下规则不进行类型检查:
{-# RULES "lookup/Ord" lookup = lookupOrd #-}
GHC(理所当然地)抱怨它无法(Ord a)
从上下文中推断出来(Eq a)
。是否有重写规则允许我执行这种基于类型的专业化?