On Nov 1, 2006, at 1:32 AM, Greg Buchholz wrote:

Thanks to everyone who replied (especially Dimitrios Vytiniotis and
Joost Visser).  I now know the standard way to write the GADT parser.
But I'm still curious if anyone has comments pertaining to the version
using type classes. It seems so close to doing what we want, and it is
pretty straightforward to implement.  The best way I can think to
describe it would be to say it uses the type system to find what it
should parse next, and dies of a pattern match failure if something
unexpected shows up, instead of checking to see if we can assemble a
type safe tree from pre-parsed parts (does that make any sense?).

    I'm curious if there could be a small change to the type system to
make the fully general "my_read" possible, or if it suffers from an
incurable defect.

I'm not sure what you're asking, but it's possible to get

  my_read :: .. => Expr -> Term a

Previously given code:

-- Give a GADT for representation types
data R a where
  Rint :: R Int
  Rbool :: R Bool
  Rpair :: R a -> R b -> R (a,b)

-- Give an existential type with a type representation
data TermEx where
  MkTerm :: R a -> Term a -> TermEx

my_readEx :: Expr -> TermEx
getTerm   :: TermEx -> R a -> Term a

Given this you can define

> class    Rep a    where rep :: R a
> instance Rep Int  where rep = Rint
> instance Rep Bool where rep = Rbool
> instance (Rep a, Rep b) => Rep (a,b) where
>   rep = Rpair rep rep
>
> my_read :: Rep a => Expr -> Term a
> my_read e = getTerm (my_readEx e) rep

/ Ulf
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to