On Fri, 2007-10-19 at 23:57 +0800, TJ wrote: > Henning Thielemann: > > > class Renderable a where > > > render :: a -> RasterImage > > > > > > scene :: Renderable a => [a] > > > > This signature is valid, but it means that all list elements must be of > > the same Renderable type. > > Yes, that's exactly the restriction I'm unhappy about. > > > You could let the user plug together the alternatives for Renderable. That > > is, declare the class Renderable and let the user define and instantiate > > > > data Figure > > = Point Something > > | Line Something > > | Polygon Something > > But if I already have the types Point, Line, and Polygon, and I want > to create a "union type" Figure as above, then my code will look like > this: > > data Point = Point Something > data Line = Line Something > data Polygon = Polygon Something > > data Figure > = FPoint Point > | FLine Line > | FPolygon Polygon > > aFigure = FPoint Point Something > aListOfFigures = [FPoint Point Something, FPolygon Polygon Something, > FLine Line Something] > > > > Is there a way of achieving what I want to do? Existentials maybe? I'm > > > still learning the basic stuff and don't grok existentials at all, but > > > I even if I use those, I'll still have to wrap things up in a > > > constructor, won't I? > > > > I assume, that you could use > > > > http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#universal-quantification > > That's a nice page :) From a quick reading, the best I came up with was this: > > data R = forall a. Renderable a => V a > > instance Show R where > render (R a) = render a > > > Which is precisely what I meant when I said that I'd still have to > wrap things up in a constructor. Is this hidden type variable thing > what "existential types" mean?
Yes. > OT: forall just introduces a new type variable, right? No. The type variable really is universally quantified (in one place: V :: forall a. Renderable a => V a). forall is used here to avoid introducing an exists keyword. jcc _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
