Conal Elliott wrote:
Thanks, Simon. The manual deriving is easier than I expected, by boilerplate delegation of constraints & methods, as below. You may want to give such an example when you document the change. Cheers, - Conal-- | Pairing of type constructors newtype (f :*: g) a = Prod { unProd :: (f a, g a) } -- deriving (Show, Eq, Ord) -- Deriving no longer works on types like :*:. So: instance (Show (f a, g a)) => Show ((f :*: g) a) where show (Prod p) = "Prod " ++ show p instance (Eq (f a, g a)) => Eq ((f :*: g) a) where Prod p == Prod q = p == q instance (Ord (f a, g a)) => Ord ((f :*: g) a) where Prod p < Prod q = p < q
Hmm, the Eq and Ord instances won't have the efficiency of newtype deriving of sharing the Eq and Ord dictionaries with the (,) type to which the operations are delegated. In fact I think that Ord definition is not correct because it didn't happen to choose one of (<=) and (compare), Ord's minimal definition (and even if it did, it's still more slightly-runtime-inefficient not to implement all those methods, depending on (f a) and (g a)'s Ord instances)
Isaac _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
