On Mon, May 21, 2007 at 12:39:20PM +0100, Simon Peyton-Jones wrote:
> | > | > 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.
Ok, thanks for the clarification. One final question then, how could I
rewrite the following in associated types:
class OneStep a b | a -> b
instance OneStep (Cons v t) t
class TwoStep a b | a -> b
instance (OneStep a b, OneStep b c) => TwoStep a c
If the fundep and b is dropped then I get:
class OneStep a
data OS a :: *
instance OneStep (Cons v t)
data OS (Cons v t) = t
class TwoStep a
data TS a :: *
instance (OneStep a, OneStep b) => TwoStep a
This last one can't be right, as I can't express the fact that the OS in
"OneStep a" provides the link with "OneStep b". So is there a way to
achieve this sort of chaining with associated types?
Sure, the fundep version requires undecidable instances, but I've been
writing quite a lot of code lately that requires that!
Haskell-Cafe mailing list