> Is there a standard Haskell trick for checking run-time assignment to 
> data types? I'd like a data type of Probability that ensures its
> Double argument is between 0 and 1.
> 
> Jim

A fairly common technique to achieve this is smart constructors
(apparently also called factory functions).

http://www.haskell.org/hawiki/FactoryFunction

You simply enforce the invariant on construction.  For your example, it
would look like,

newtype Probability = Probability Double

probability p | 0.0 <= p && p <= 1.0 = Probability p

unProbability (Probability p) = p

Simply don't export Probability's constructor and it will be impossible
to create a Probability with a value outside of [0,1].  However, you may
want to export the constructor, or alternatively, export a function with
a name like unsafeProbability (= Probability) for situations where you
can statically decide that the invariant will hold if the superfluous
checking costs too much, which doesn't seem particularly likely in this
case.  Providing a function of type Double -> Maybe Probability is also
likely a good idea.
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to