It depends very much on what you want to do with the numbers and what do you mean by most efficient.
If you want to represent a natural number n, you need log n bits of information. And since an ADT can have only finitely many distinct constructors, it encodes a finite number of bits, so you need to have structure with at least log n nodes.
I recommend you very much Chapter Numerical Representations from Chris Okasaki's Functional Data Structures (the thesis is available online here). It describes various tree-like data structures, supporting different sets of operations, and how they relate to natural numbers. Everything below is what I learned from the book.
Expanding on Cirdec's comment: You can define
data N = Zero | Positive
data Positive = One | Add Positive Positive
This gives you O(1) addition and subtracting by one. On the other hand, the size of the structure will be O(n).
You can use a binary representation with O(log n) space, but then addition will be O(log n):
data N = Zero | Positive
data Positive = One | Twice Positive | TwicePlusOne Positive
increment and decrement will be almost amortized O(1). A sequence of increments will go to depth d only every 2^d operations, so in average, each increment will be O(1). Similarly for decerements. I said almost above, because if you interchange increments and decrements, then you can flip between a O(log n) increment and decrement operations. A solution to this is to add some redundancy:
data N = Zero | Positive
data Positive = One | Twice Positive | TwicePlusOne Positive | TwicePlusTwo Positive
Now every time an operation needs to go one level deeper, it leaves the current node at TwicePlusOne
, which means the next operation affecting the node will stop at it, regardless if it's an increment or decrement.
If you want constant time addition, the data structure can be extended for that (look for Lists With Efficient Catenation in the book), but then again you can end up with O(n) memory, if the sequence of operations is bad. There is an open SO question How can natural numbers be represented to offer constant time addition? asking if it's possible to get both.