module Positive (toPositive, getPositive, Positive) where
newtype Positive = Positive { unPositive :: Int }
toPositive :: Int -> Maybe Positive
toPositive n = if (n <= 0) then Nothing else Just (Positive n)
-- We can't export unPositive, because unPositive can be used
-- to update the field. Trivially renaming it to getPositive
-- ensures that getPositive can only be used to access the field
getPositive :: Positive -> Int
getPositive = unPositive
The above module doesn’t export the constructor, so the only way to build a value of type Positive
is to supply toPositive
with a positive integer, which you can then unwrap using getPositive
to access the actual value.
You can then write a function that only accepts positive integers using:
positiveInputsOnly :: Positive -> ...