[Haskell-cafe] Newbie Question on type constructors

Brian Beckman bbeckman at exchange.microsoft.com
Mon Nov 1 15:30:15 EST 2004

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?  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, but I don't know how to prevent users from calling "Circle"
directly (in some other languages, I could declare the raw constructor
to be "private", and, in Haskell, there may be some way for me to hack
module exports to hide the raw constructor, but I haven't seen a way to
do that).

In any event, it might be useful if I could have some pattern to prevent
circumvention of initialization code. Advice?

-----Original Message-----
From: haskell-cafe-bounces at haskell.org
[mailto:haskell-cafe-bounces at haskell.org] On Behalf Of Ben Rudiak-Gould
Sent: Monday, November 01, 2004 11:33 AM
To: finnw at iname.com
Cc: haskell-cafe at haskell.org
Subject: Re: [Haskell-cafe] Newbie Question on type constructors

Finn Wilcox wrote:

 >On Mon, 1 Nov 2004, Ben Rudiak-Gould wrote:
 >>In particular, one cannot write an invert :: (a->b) -> Maybe
 >>(b->a) which never returns a wrong answer, except for invert = const
>>Nothing  >  >How about:
 >invert = undefined
 >This never returns an answer at all, so it can't return a wrong one!

Sorry, I should have been clearer: my Nothing return was intended to
mean "I don't know an answer", not "there is no answer". So my const
Nothing is like your undefined, a function which never returns an answer
(and thus never returns a wrong one).

-- Ben

Haskell-Cafe mailing list
Haskell-Cafe at haskell.org

More information about the Haskell-Cafe mailing list