Perhaps this thought exercise will make things clear: > class Show a => Foo a where > toFoo :: String -> a
> foos :: (Foo a) => [(String, a)] > foos = map (\f -> (show f, f)) [toFoo "a", toFoo "b", toFoo "c"] > data Foo1 = Foo1 > instance Show Foo1 where show _ = "1" > instance Foo Foo1 where toFoo _ = Foo1 > data Foo2 = Foo2 > instance Show Foo2 where show _ = "2" > instance Foo Foo2 where toFoo _ = Foo2 > exercise :: [String] > exercise = map fst foos Exercise for the reader: what should the contents of "exercise" be? Keep in mind that your question is exactly the same as this one, from the compiler's point of view. -- ryan On Wed, Mar 3, 2010 at 10:48 PM, Marcus Uneson <marcus.une...@gmail.com> wrote: > Thanks. I realize there are many ways to make it compile. > However, I am trying to understand the mechanism behind -- > why does the first example compile and what constraints does > enumerateMethodNames add on a (which it does not inspect)? _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe