
On May 5, 2010, at 9:52 PM, John Creighton wrote:
I've seen forall used in a few places related to Haskell. I know their is a type extension call "explicit forall" but by the way it is documnted in some places, the documentation makes it sound like it does nothing usefull.
However on Page 27 of Haskell's overlooked object system:
We define an existential envelope for shape data. data OpaqueShape = forall x. Shape x => HideShape x
... (presumably:) class Shape x where area :: x -> Float ... etc...
It seems that forall can be used as a form of up casting.
Yes, but you can do this without the type class magic, and have the same degree of safety.
data Shape = Square Int | Rectangle Int Int | Circle Float Float | etc... data OpaqueShape = HideShape Shape area :: OpaqueShape -> Float area = ...
These constructs are structurally equivalent. The extra layer of abstraction doesn't really add anything in either case. HideShape (as a function) is an isomorphism onto Shapes in both cases.