[Haskell-cafe] Newbie Question on type constructors

Benjamin Franksen benjamin.franksen at bessy.de
Mon Nov 1 17:01:18 EST 2004


On Monday 01 November 2004 21:51, Jon Fairbairn wrote:
> On 2004-11-01 at 12:30PST "Brian Beckman" wrote:
> > Most interesting discussion -- in reading it, I realized that I had a
> > 'hidden agenda' in asking my question (hidden even from myself), and
> > that is: can I put interesting functionality, like precondition checks &
> > data validation, in data constructors?
>
> No, though one could make a case that you should be able to.

And there are (experimental) languages in which you can, see e.g. Cayenne or 
Epigram. 'Dependent Types' is the keyword here.

> > I suspect not, and that's why I tend to write something
> > like the following:
> >
> >   data Shape = Circle Float
> >
> >              | Square Float
> >
> >     deriving (Eq, Show)
> >
> >   circle :: Float -> Shape
> >   circle x = if (x <= 0) then error "Bad radius!" else Circle x
> >
> > That's fine,
>
> Yup.
>
> > but I don't know how to prevent users from calling "Circle"
> > directly
>
> Put the data declaration in a module, export the type, but
>
> not the constructor you want to hide:
> > module Shape (Shape(Square), circle) where

Since we were talking about 'what can one do with a constructor as compared 
with a function', it should be mentioned that this also has a disadvantage: 
you loose pattern matching outside the module. I.e. no longer can say

	...
	case x of
		Circle radius -> ...
		Square edge -> ...

BTW, would it be possible (in principle) to allow constructor export 
'read-only', so matching against a constructor is allowed but not 
constructing a value?

Ben


More information about the Haskell-Cafe mailing list