One way to get around this is to do something like: > newtype DetectiveLocations = DetectiveLocations SomeType1 > newtype FugitiveLocations = FugitiveLocations SomeType2 > > class MkUn nt t | nt -> t where > mk :: t -> nt > un :: nt -> t > > instance MkUn DetectiveLocations SomeType1 where > mk = DetectiveLocations > un (DetectiveLocations dl) = dl > > -- similarly for FugLocs
Then, your function is a bit cleaner with (note that the type sig is very important now): > findFugitive dL fL StartGame = > mk (minusSet (un dL) (occupiedStops (un fL)) Another way to do it would be if 'minusSet' were a class method, then you could use GHC's newtype deriving feature (or in Hugs just define the obvious instances). For instance, if we had: > class Set s where > minusSet :: Set a -> Set a -> Set a > ... then you could do: > newtype DetectiveLocations = DetectiveLocations SomeType1 > deriving (Set) > newtype FugitiveLocations = FugitiveLocations SomeType2 > deriving (Set) assuming SomeType1 and SomeType2 were instances of Set; then your second definition would be fine. Finally, if you make your constructor names shorter, it doesn't look quite so bad and you get nice error messages and helpful type checking. As for why you get ambiguous variables, I'd need to see the offending data and instance definitions. HTH - Hal -- Hal Daume III "Computer science is no more about computers | [EMAIL PROTECTED] than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Wed, 26 Feb 2003, Mike T. Machenry wrote: > I am trying to use type classes to get some percollate actions through a > nested data structure. The problem is I can't make an instance of a class > unless the type is defined with newtype or data. This means all of my > functions look something like this: > > findFugitive :: DetectiveLocations -> FugitiveLocations -> Move -> FugitiveLocat > findFugitive (DetectiveLocations dL) (FugitiveLocations fL) StartGame = > (FugitiveLocations minusSet fL (occupiedStops dL)) > > instead of this: > > findFugitive :: DetectiveLocations -> FugitiveLocations -> Move -> FugitiveLocat > findFugitive dL fL StartGame = minusSet fL (occupiedStops dL) > > which is much simpler to read. Why can't I make a normal type an instance of > a type class? I get errors that it's an ambiguous type. > > thanks, > -mike > _______________________________________________ > Haskell mailing list > [EMAIL PROTECTED] > http://www.haskell.org/mailman/listinfo/haskell > _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
