
On 13/03/2007, at 18:25, John Meacham wrote:
once we have ordNub, we can create lots of RULES like the following
{-# RULES "nub/ordNub" nub = ordNub :: [String] -> [String] #-} {-# RULES "nub/ordNub" nub = ordNub :: [Int] -> [Int] #-} {-# RULES "nub/ordNub" nub = ordNub :: [Integer] -> [Integer] #-}
actually, we probably want one that uses IntMap for ints. it is signifigantly faster.
very nice idea!
I don't suppose there is a way to match a RULE to a class constraint? I don't see how it would be implemented in any easy way since classes get desugared away pretty early... but it would be an interesting feature..
{-# RULES "nub/ordNub" forall (a::*) . Ord a => nub = ordNub :: [a] -> [a] #-} or something...
I think yes, the right syntax would be something like:
{-# RULES "nub/ordNub" forall (x::Ord a => a). nub x = ordNub x #-}
But hopefully someone else will confirm. Also, what happens if the general Ord rule is added. Is it possible to convince GHC to use the more specific rule for Int before the general one?