Interesting. But from a practical point of view (I know, irrelevant! *grin*), it's very tempting to piggyback the entirety of the typeclass feature on a simple technique like this.
It also gives you the benefit that functions like this: > manyConstraints :: (Show a, Eq a, Data a) => a -> Bool end up only taking a single "type" argument, instead of one per class. In addition, when you use types directly you can remove arguments that are determined by FDs: > class Elem c e | c -> e where ... > instance Elem [a] a where ... > toList :: Elem c e => c -> [e] > toList = ... turns into something like > toList :: Type c -> c -> [e] using e = fdElem c > fdElem c = typecase c of > [e] -> e > ... other instances ... (without the dependency, you have to pass both the type of c and e to toList.) -- ryan On Tue, Dec 9, 2008 at 1:36 AM, Wouter Swierstra <[EMAIL PROTECTED]> wrote: >> The biggest wart is that "view" is not a total function; the compiler >> needs to be extra careful to only call it on types that are instances >> of "View". I wonder if there is a good way to solve this problem? > > The usual way to solve this is to define a data type corresponding to all > the types in your class. For example: > > data Data a where > | CHAR : Data Char > | STRING : Data String > | LIST : Data a -> Data [a] > ... > > With this representation you no longer need typecase (which is horrendous > semantic hack) and your dispatch function can be made total. Hope this > helps, > > Wouter > > > > This message has been checked for viruses but the contents of an attachment > may still contain software viruses, which could damage your computer system: > you are advised to perform your own checks. Email communications with the > University of Nottingham may be monitored as permitted by UK legislation. > > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe