On 03.08.2010 21:25, Andrew Coppin wrote:
Now suppose that instead of a container type with an associated element
type, what we want is several pairs of types having a one-to-one
relationship, and we want to be able to traverse that relationship in
either direction. What's the best way to do that?
(I tried just having two mirror image classes like the one above. But
that doesn't work; there's no guarantee that going one way and then
going back the other way will definitely take you back to where you
started. I tried to make that a constraint, and got an error message
that basically says "this feature is not implemented". Great. Still,
there's probably a better way to do this.)
That's possible with multiparameter type classes and fundeps. Without
any further words I'm pasting code snippet:
> class Relator a b | a -> b, b -> a where
> to :: a -> b
> from :: b -> a
>
> data Knight = Knight deriving Show
> data Dragon = Dragon deriving Show
>
> instance Relator Knight Dragon where
> to _ = Dragon
> from _ = Knight
I'm not sure that it's what you want.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe