[Haskell-cafe] Re: Positive integers
lemming at henning-thielemann.de
Fri Mar 24 07:55:55 EST 2006
On Fri, 24 Mar 2006, Aaron Denney wrote:
> On 2006-03-24, Daniel McAllansmith <dagda at xtra.co.nz> wrote:
>> Unless I've missed it, there is no typeclass for positive integers in GHC.
>> Is there any particular reason it doesn't exist?
> The number of useable operations is small, and checks for leaving the
> domain would have to be done all the time. It basically doesn't buy
A new type, say Cardinal as in Modula, would document for the user of a
function that only non-negative numbers are allowed and the function
writer can be sure, that only non-negative numbers are passed. Today
function writers have to check explicitly for negative numbers, when they
are not wanted. With a Cardinal type some of these checks can be dropped
because of the static guarantee that Cardinals are never negative.
Further on think of QuickCheck: A Cardinal type with an Arbitrary
instance would save us the (>=0) condition and it would reduce the number
of tests that must be skipped because of non-fulfilled conditions. Because
I was confronted with adding positivity checks to QuickCheck properties
quite frequently, I finally wrote wrappers
newtype Cardinal = Cardinal Integer deriving (Show, Read, Eq, Ord, Ix)
newtype Card = Card Int deriving (Show, Read, Eq, Ord, Ix)
in order to simplify such checks.
Since the pros and cons of new types are true for every number type, the
discussion whether Cardinal should be supported or not ends up with the
question how often it can be used. When I look through my Modula programs
I encounter CARDINAL quite often, so yes, it seems to be useful. Inductive
definitions of functions of integers need a base case - which is often
zero. That is such functions are intended for Cardinals rather than
Integers. The (n+k) pattern are often defended because of its use in
inductive definitions. So I claim that Cardinals are at least as important
as (n+k) patterns. :-)
More information about the Haskell-Cafe