| > | > instance G a b where
| > | >     data E a = EC b -- this line - the b is not in scope.
| > | >     wrap = EC
| > | >     unwrap (EC b) = b
| > |
| > | I get "Not in scope: type variable `b'".
| >
| > That's a bug.  b should be in scope

I was wrong.  It's not a bug.  E is supposed to be a type *function*, so it 
can't mention anything on the RHS that is not bound on the LHS.  We'll improve 
the documentation.

| Ahh, cool. I which case I wonder if this too is a bug? :
|
| data Nil = Nil
| data Cons :: * -> * -> * where
|              Cons :: val -> tail -> Cons val tail
|
| class F c v t | c -> v t where
|     data FD c t :: *
|
| instance F (Cons v t) v t where
|     -- this blows up with "conflicting definitions for `t'"
|     data FD (Cons v t) t = FDC v

As I said, associated types are an *alternative* to fundeps. We have not even 
begun to think about what happens if you use both of them together.  You should 
not need to do so.

| Somehow I doubt it, but is the following any less suspicious?
|
| class F a b where
|     type BThing a :: *
|     data FD a :: *
|     wrap :: b -> FD a
|     unwrap :: FD a -> b
|
| instance F a b where
|     type BThing a = b
|     data FD a = FDC (BThing a)
|     wrap b = FDC b
|     unwrap (FDC b) = b
|
| Incidentally, that "type BThing a = b" line also blows up with
| "Not in scope: type variable `b'".

No, that is wrong in the same way as before.  BThing is a *function* so its 
results must depend only on its arguments.

S
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to