[Haskell-cafe] Scope of type variables in associated types
Tom Schrijvers
Tom.Schrijvers at cs.kuleuven.be
Mon May 21 08:55:30 EDT 2007
> 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 <<<< data constructor missing !!!
>
> 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?
You'd have to write
> class OneStep a
> data OS a :: *
> instance OneStep (Cons v t)
> data OS (Cons v t) = OSC t
>
> class TwoStep a
> data TS a :: *
> instance (OneStep a, OneStep (OS a)) => TwoStep a where
> type TS a = TSC (OS (OS a))
which seems rather awkward with all these additional data type
constructors.
You'd be better off with associated type synonyms:
> class OneStep a
> type OS a :: *
> instance OneStep (Cons v t)
> type OS (Cons v t) = t
>
> class TwoStep a
> type TS a :: *
> instance (OneStep a, OneStep (OS a)) => TwoStep a
> type TS a = OS (OS a)
which are currently under development.
--
Tom Schrijvers
Department of Computer Science
K.U. Leuven
Celestijnenlaan 200A
B-3001 Heverlee
Belgium
tel: +32 16 327544
e-mail: tom.schrijvers at cs.kuleuven.be
More information about the Haskell-Cafe
mailing list