On Fri, Sep 28, 2012 at 5:36 PM, Francesco Mazzoli <f@mazzo.li> wrote:
At Fri, 28 Sep 2012 17:19:36 -0700,
Alexander Solla wrote:
> Well, then what exactly is the problem?  Are you getting an error?

...well yes.  The error I get with the posted class declarations is

   Not in scope: type variable `b'

at the line with

   class Foo a b => Bar a where

Which I get because all the type vars in the LHS must be referenced on the RHS
(or so it seems).

Yes, indeed.
 

Now, in my case the problem does not stop there, because I also want to
reference the tyvar on the LHS in a type signature of a method, since in that
case there is a fundep on b (`a -> b'), which makes `b' decidable if you have
`a' and `Foo a b'.

Only with respect to type inference.
 

> You don't need to bring 'b' into scope.  You will already have real types in
> scope.
>
> instance Foo A B
> instance Bar A where foo A B = C

Again, I'm not sure what you mean here.

I wouldn't have replied with that line of thought if you had just told us what the problem was in the first place.  I /was/ saying that you can use explicit type annotations to disambiguate instances.  

Most of us haven't memorized the Haskell 2010 report.  We let the compiler tell us what's wrong and either learn why, or how to fix it.  So post your errors.

By the way, it is rather rude to publicly post a private email...

Now, on to your real problem.

Use TypeFamilies instead:

class Foo a where
         type BarThing a :: *

class Foo a => Bar a where
         foo :: a -> BarThing a -> b

This is pretty pointless, since you can just refactor into the nearly equivalent:

class Foo a

class Foo a => Bar a where
        type BarThing a :: *
        foo :: a -> BarThing a -> c

It may or may not matter to which family the type synonym belongs.

What is the problem you are actually trying to solve?