[Haskell-cafe] Families of type classes

Daniel Fischer daniel.is.fischer at web.de
Sun Nov 6 12:49:31 EST 2005


Am Sonntag, 6. November 2005 17:30 schrieb Klaus Ostermann:
> Daniel Fischer schrieb:
> > I'd prefer (very strongly) something like
> >
> > class Graph g n e | g -> n, g -> e where
> >     isConnectedTo :: g -> n -> e -> Bool  -- or perhaps rather without
> > "g" startNode, endNode :: e -> n
> >     . . .     -- other Methods of interest like nodes, edges, components
> > . . .
> >
> > with, e.g.
> >
> > instance Graph (Map node [node]) node (node,node) where . . .
>
> Thanks for the suggestion. This looks good, but
> it seems as if the "g" needs to occur in every signature, otherwise
> the interpreter throws a "No instance for ... arising from ..."
> error if you want to apply the function. Hence startNode would need to be
> startNode :: g -> e -> n rather than startNode :: e -> n
>
> Is there any way to get rid of this dummy argument?
>
> Klaus

Two I see, 
1. retain class Edge,

class Edge e n | e -> n, n -> e where
    isConnectedTo :: n -> e -> Bool
    startNode, endNode :: e -> n

and then

class (Edge e n) => Graph g n e | g -> n, g -> e where
     -- other methods if wanted

2. add more FunDeps,

class Graph g n e | g -> n, g -> e, e -> n, n -> e, n e -> g where . . . 

works.

Probably the second isn't wanted, because it introduces too much rigidity and 
an ADT might be better.

Cheers,
Daniel


More information about the Haskell-Cafe mailing list