[Haskell-cafe] Constructor constraints

Malcolm Wallace Malcolm.Wallace at cs.york.ac.uk
Tue Sep 20 12:22:56 EDT 2005

Rich Neswold <rich.neswold at gmail.com> writes:

> For instance, I want to make a new type that is a 4 element tuple 
> where each element is greater than or equal to the previous entry.
> data Category = Membership a a a a

You can make a 'smart' constructor function, and hide the real data
constructor so that it cannot be used:

  module Category (Category(),membership) where
    data Category = Membership a a a a
    membership :: Ord a => a -> a -> a -> a -> Category a
    membership a b c d
        | d>=c && c>=b && b>=a  = Membership a b c d
        | otherwise             = error "bad values"

However, you probably don't really want your program to die with
"error" when you get badly-constrained data, so it might be better
to look into something like the Maybe type for your smart constructor:

    membership :: Ord a => a -> a -> a -> a -> Maybe (Category a)

so you can catch the failing cases and do something sensible with them.


More information about the Haskell-Cafe mailing list