On 24 November 2011 16:46, José Pedro Magalhães <j...@cs.uu.nl> wrote: > Hi Bas, > > On Thu, Nov 24, 2011 at 09:23, Bas van Dijk <v.dijk....@gmail.com> wrote: >> >> Hello, >> >> Now that we have DefaultSignatures, why is it not allowed to have >> multiple default method implementations, as in: >> >> {-# LANGUAGE DefaultSignatures #-} >> >> class Foo a where >> foo :: a >> foo = error "foo" >> >> default foo :: Num a => a >> foo = 1 >> >> GHC complains: "Conflicting definitions for `foo'" >> >> The following use of multiple default signatures also gives the same >> error: >> >> class Foo a where >> foo :: a >> >> default foo :: Fractional a => a >> foo = 0.5 >> >> default foo :: Num a => a >> foo = 1 >> >> Couldn't GHC always pick the most specific default method, just as it >> does with instances when OverlappingInstances is enabled? > > As far as I understand, GHC never looks at the context to decide which > instance is > applicable: http://www.haskell.org/ghc/docs/7.2.1/html/users_guide/type-class-extensions.html#instance-overlap > Your instances above are duplicates.
Right. The reason I asked is that I'm adding default generic implementations for the 'arbitrary' and 'shrink' methods of the Arbitrary type class of QuickCheck: class Arbitrary a where arbitrary :: Gen a shrink :: a -> [a] shrink _ = [] default arbitrary :: (Generic a, GArbitrary (Rep a)) => Gen a arbitrary = fmap to gArbitrary default shrink :: (Generic a, GArbitrary (Rep a)) => a -> [a] shrink = map to . gShrink . from However the normal default implementation of 'shrink' conflicts with the generic default implementation. So I had to remove it and manually add it to each of the instances that previously implicitly used the default implementation. This is not a big deal though. Bas _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users