
David Menendez wrote:
Ben Rudiak-Gould writes:
Also, the rule would not be quite as simple as you make it out to be, since
forall a. (forall b. Foo a b => a -> b) -> Int
is a legal type, for example.
Is it? GHCi gives me an error if I try typing a function like that.
{-# OPTIONS -fglasgow-exts #-} class Foo a b
f :: forall a. (forall b. Foo a b => a -> b) -> Int f = undefined
No instance for (Foo a b) arising from instantiating a type signature at x.hs:5:4-12 Probable fix: add (Foo a b) to the type signature(s) for `f' Expected type: (forall b1. (Foo a b1) => a -> b1) -> Int Inferred type: (a -> b) -> Int In the definition of `f': f = undefined
I think there would need to be a top-level constraint on |a| to guarantee that an instance of |Foo a b| exists, like
forall a. (exists c. Foo a c) => (forall b. Foo a b => a -> b) -> Int
Is "exists" enough to ensure that 'f' is given a dictionary that will work with all possible choices for 'b'? I'd have thought it would need: forall a. (forall c. Foo a c) => (forall b. Foo a b=> a->b)->Int Regards, Brian.