Data types representing the digits zero through nine.

## Modules

Each of the following modules defines a different type named
`D10`

, all of which are different representations of the same
concept:

`D10.Char`

- Defines a `D10`

type as a newtype for `Char`

,
where the values are restricted to characters between
`'0'`

and `'9'`

`D10.Num`

- Defines a `D10`

type as a newtype for any
type with an instance of the `Num`

class, where the values
are restricted to numbers between `fromInteger 0`

and
`fromInteger 9`

`D10.Safe`

- Defines a `D10`

type as `D0 | D1 | D2 | ... | D9`

The `Arithmetic`

modules provide infix operators (`+`

), (`-`

), (`*`

)
for modular arithmetic:

`D10.Char.Arithmetic`

`D10.Num.Arithmetic`

`D10.Safe.Arithmetic`

The following modules export constructors that can be used
incorrectly:

`D10.Char.Unsafe`

`D10.Num.Unsafe`

Functions to test whether values of various types represent
digits in the range 0 to 9:

## Quasi-quoters

The `D10.Char`

and `D10.Num`

modules include quasi-quoters
named `d10`

used to express single digits. For example, 7
can be written as `[d10|7|]`

. This is an important feature
because the `D10`

types defined in these modules have
unsafe constructors, and the quasi-quoters provide
compile-time assurance that we never construct a `D10`

that represents a value outside the range 0 to 9.

`D10.Char`

, `D10.Num`

, and `D10.Safe`

include quasi-quoters
named `d10list`

to express lists of digits. For example,
[4, 5, 6] can be written as `[d10list|456|]`

.