
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.