Lambda calculus can be used to define what a computable function is. The question of whether two lambda calculus expressions are equivalent cannot be solved by a general algorithm, and this was the first question, even before the halting problem, which undecidability could be proved.
In lambda calculus, every expression stands for a function with a single argument (argument::input of a function); the argument of the function is in turn a function with a single argument, and the value of the function is another function with a single argument.
A function of two variables is expressed in lambda calculus as a function of one argument which returns a function of one argument (see currying).
In functional programming languages, it is common to find abstractions related to functions, such as lambdaabstractions (making a term into a function of some variable), higher-order functions (parameters are functions), bracket abstraction (making a term into a function of a variable).
Data abstraction is the enforcement of a clear separation between the abstract properties of a data type and the concrete details of its implementation.
Object-oriented languages are commonly claimed to offer data abstraction; however, their inheritance concept tends to put information in the interface that more properly belongs in the implementation; thus, changes to such information ends up impacting client code, leading directly to the fragile base class problem.