Yes, it's possible to do this. I've only checked it "by eye" but it looks OK to me.
I don't know Haskell, but I don't think the effect is the same. In your XSD you've defined Shape as an element that contains either a Circle or a Rectangle as a child element. If you want to define Circle and Rectangle as being substitutable for Shape (which sounds a more plausible design), then you should:
- define Shape with
abstract="true"
- define Circle with
substitutionGroup="Shape"
- define Rectangle with
substitutionGroup="Shape"