使用 GHC RULESpragma,可以为特定类型专门化多态函数。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)。是否有重写规则允许我执行这种基于类型的专业化?