Since everything is a lambda term, in lambda calculus you can only define lambda terms (functions) that “operates” on other lambda terms (the only “values” allowed, that are written with the λ notation).
So, if we want to show, from a theoretical point of view, that the lambda calculus allows one to write any computable function, we need to find a suitable representation (encoding, in technical terms) of natural numbers, over which to define computable functions (note that with the Church encoding, you are representing through lambda terms numbers, and not numerals !).
Having encoded the numbers as lambda terms, one can define all the usual functions on “numbers”. For instance, the successor function can be defined as:
SUCC := λn.λf.λx.f (n f x)
that takes a “number” (that is, a lambda term which encodes a number) and returns its successor (that is, the lambda term which encodes the successor of that number). So that, for instance, ((SUCC) 0)
β-reduces to 1
(that is ((λn.λf.λx.f (n f x)) λf.λx.x)
is β-equivalent to λf.λx.f x
), and so on. And starting from this, one can define all the other functions on “numbers”, like sum, multiplication, exponentiation, etc.
What is the use of such encoding? Of course, it is not useful to give a practical programming language to perform the sum of two numbers. But it allows the study of this formalism in the field of computability theory, for instance, to provide a way of expressing the Church-Turing thesis, that asserts that any computable operator (and its operands) can be represented under Church encoding.