使用GHC RULES编译指示,可以为特定类型专门化多态函数.Haskell报告中的示例:
genericLookup :: Ord a => Table a b -> a -> b
intLookup :: Table Int b -> Int -> b
{-# RULES "genericLookup/Int" genericLookup = intLookup #-}
Run Code Online (Sandbox Code Playgroud)
这将使GHC intLookup在整数索引表和通用版本上使用,否则intLookup可能会更高效.
我想用类似下面的(略微简化的)函数来完成类似的事情:
lookup :: Eq a => [(a, b)] -> a -> b
lookupOrd :: Ord a => [(a, b)] -> a -> b
Run Code Online (Sandbox Code Playgroud)
其中从输入列表lookupOrd创建一个Map然后使用Map.lookup,这需要a成为其成员Ord.
现在我想告诉GHC lookupOrd应该使用而不是lookup什么时候a确实是Ord类型类的成员.但是,以下规则并未进行类型检查: …