[Haskell] Type-Level Naturals Like Prolog?

Jared Warren jawarren at gmail.com
Thu Jul 13 01:25:39 EDT 2006


Haskell's type checking language is a logical programming language.
The canonical logical language is Prolog. However, Idealised Prolog
does not have data structures, and does Peano numbers like:

  natural(zero).
  natural(x), succ(x,y) :- natural(y)

And I believe (but cannot confirm):

  succ(zero,y).
  succ(x,y) :- succ(y,z)

Why can't Haskell (with extensions) do type-level Peano naturals in
the same fashion? The code would be something like:

> data Zero
>
> class Natural x where
> 	toInt :: x -> Integer
> instance Natural Zero where
> 	toInt _ = 0
> instance (Natural x, Succ x y) => Natural y where
> 	toInt y = undefined + 1
>
> class Succ x y
> instance Succ Zero y
> instance Succ x y => Succ y z
>
> zero = toInt (undefined :: Zero) -- THIS SUCCEEDS
>
> one = toInt (undefined :: (Succ Zero x) => x) -- THIS FAILS

Thanks,
Jared Warren


More information about the Haskell mailing list