[Haskell-cafe] Polymorphic (typeclass) values in a list?
jonathanccast at fastmail.fm
Fri Oct 19 12:00:28 EDT 2007
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
> 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?
> 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.
More information about the Haskell-Cafe