Koen writes: Consider the following datatype declaration: data Eq a => Foo a = Foo a It introduces a new constructor function with the type: Foo :: Eq a => a -> Foo a So far so good. This is what we expect. It also introduces a new pattern, which will result in the following typing: unFoo :: Eq a => Foo a -> a unFoo (Foo a) = a Why?? I require the context at _construction_ time, not at _destruction_ time! Actually, when I unpack (Foo a), I _know_ there must be a dictionary (Eq a) somewhere! Because I required that at construction time! This very issue is under discussion right now in the Standard Haskell committee. See http://www.cs.chalmers.se/~rjmh/Haskell/Messages/Display.cgi?id=302 John Hughes