All Topics  
Anonymous function

 

   Email Print
   Bookmark   Link

 

Anonymous function


 
 

In computingComputing

Originally, the word computing was synonymous with counting and calculating, and a science and technology that deals wit...
, an anonymous function is a functionFunction (mathematics)

In mathematics, a function relates each of its inputs to exactly one output....
 (or a subroutineSubroutine

In computer science, a subroutine is a portion of code within a larger program, which performs a specific task and is relat...
) defined, and possibly called, without being bound to a name. In lambda calculusLambda calculus

In mathematical logic and computer science, lambda calculus, also ?-calculus, is a formal system designed to investiga...
, all functions are anonymous. The Y combinatorY Combinator

Y Combinator is a seed-stage startup funding firm, started by Paul Graham, Robert Morris, Trevor Blackwell, and Jessica Livi...
 can be utilised in these circumstances to provide anonymous recursionAnonymous recursion

In computer science, anonymous recursion is a recursion technique that uses anonymous functions....
. Certain programming languages also provide support for both named and anonymous functions. The lambda calculus without anonymous function definition forms a combinatory logicCombinatory logic

Combinatory logic is a notation introduced by Moses Schnfinkel and Haskell Curry to eliminate the need for variables in math...
.

Some object-oriented programming languages have anonymous classes, which are a similar concept. JavaJava (programming language)

Java is an object-oriented programming language developed by James Gosling and colleagues at Sun Microsystems in the early 1...
 is such a language.

Uses

Anonymous functions can be used to contain functionality that need not be named and possibly for short-term use. Some notable examples include closureFacts About Closure (computer science)

In programming languages, a closure is a function that refers to free variables in its lexical context....
s and curryingCurrying

In computer science and linguistics , currying or Schnfinkelisation...
.

All of the code in the following sections is in pythonPython (programming language)

Python is a programming language created by Guido van Rossum in 1990....
.

Sorting

When attempting to sort in a non-standard way it may be easier to contain the comparison logic as an anonymous function instead of creating a named function.
Most languages provide a generic sort function that implements a sort algorithm that will sort arbitrary objects.
This function usually accepts an arbitrary comparison function that is supplied two items and the function indicates if they are equal or if one is "greater" or "less" than the other (typically indicated by returning a negative number, zero, or a positive number).

Consider sorting items in a list by the name of their class (everything in python has a class):


a = [10, '10', 10.0]
a.sort(lambda x,y: cmp(x.__class__.__name__, y.__class__.__name__))
print a
[10.0, 10, '10']


Note that 10.0 has class name "float", 10 has class name "int", and '10' has class name "str". The sorted order is "float", "int", then "str".

The anonymous function in this example is the lambda expression:

lambda x,y: cmp(...)


The anonymous function accepts two arguments — x & y — and returns the comparison between them using the built-in function cmp.
Another example would be sorting a list of strings by length of the string:


a = ['three', 'two', 'four']
a.sort(lambda x,y: cmp(len(x), len(y)))
print a
['two', 'four', 'three']


which clearly has been sorted by length of the strings.

Closures

Closures are functions evaluated in an environment containing bound variables. The following example binds the variable "threshold" in an anonymous function that compares the input to the threshold.


def comp(threshold):
return lambda x: x < threshold


This can be used as a sort of generator of comparison functions:


a = comp(10)
b = comp(20)

print a(9), a(10), a(20), a(21)
True False False False

print b(9), b(10), a(20), b(21)
True True False False


It would be very impractical to create a function for every possible comparison function and may be too inconvenient to keep the threshold around for further use. Regardless of the reason why a closure is used the anonymous function is what the contains the functionality that does the comparing.

Currying

Currying is transforming a function from multiple inputs to fewer inputs (in this case integer division).


def divide(x,y):
return x/y

def divisor(d):
return lambda x: divide(x,d)

half = divisor(2)
third = divisor(3)

print half(32), third(32)
16 10

print half(40), third(40)
20 13


While the use of anonymous functions is perhaps not common with currying it still can be used. In the above example, the function divisor generates functions with a specified divisor. The functions half and third curry the divide function with a fixed divisor.

(It just so happens that the divisor function forms a closure as well as curries by binding the "d" variable.)

Map

The map function performs a function call on each element of an array. The following example squareSquare (algebra)

In algebra, the square of a number is that number multiplied by itself....
s every element in an array with an anonymous function.


a = [1, 2, 3, 4, 5, 6]
print map(lambda x: x*x, a)
[1, 4, 9, 16, 25, 36]


The anonymous function accepts an argument and multiplies it by itself (squares it).

Fold

The fold/reduce function reduces a list of elements repeatedly from left-to-right until only one element remains.


a = [1, 2, 3, 4, 5]
print reduce(lambda x,y: x*y, a)
120


This performs:

The anonymous function here is simply the multiplication of the two arguments.

List of languages

The following is a list of programming languageProgramming language

A programming language is an artificial language that can be used to control the behavior of a machine, particularly a compu...
s that fully support unnamed anonymous functions; support some variant of anonymous functions; and have no support for anonymous functions.

This table shows some general trends. First, the languages that do no support anonymous functions — CC (programming language)

The C programming language is a general-purpose, procedural, imperative computer programming language developed in the earl...
, C++C++

C++ is a general-purpose, high-level programming language with low-level facilities....
, C# †, JavaJava (programming language)

Java is an object-oriented programming language developed by James Gosling and colleagues at Sun Microsystems in the early 1...
 — all employ static typing. This does not, however, mean that static languages are incapable of support anonymous functions. Second, the languages that treat functions as first-class functionFirst-class function

In computer science, a programming language is said to support first-class functions if it treats functions as first-class o...
s — JavaScriptJavaScript

JavaScript is the name of Netscape Communications Corporation's implementation of ECMAScript, a scripting programming langua...
, Lisp, Scheme, ML, HaskellHaskell (programming language)

Haskell is a standardized pure functional programming language with non-strict semantics, named after the logician Haskell C...
, PythonPython (programming language)

Python is a programming language created by Guido van Rossum in 1990....
,RubyRuby (programming language)

Ruby is a reflective, object-oriented programming language....
, PerlPerl

Perl, also Practical Extraction and Report Language is a dynamic procedural programming language designed by Larry Wa...
 — generally have anonymous function support.

Language Full support Some support No support
ActionScriptActionScript

ActionScript is an ECMAScript-based programming language used for scripting Adobe Flash movies and applications....
 
CC (programming language)

The C programming language is a general-purpose, procedural, imperative computer programming language developed in the earl...
  
C++C++

C++ is a general-purpose, high-level programming language with low-level facilities....
  
C# v1  
C# v2  
C# v3  
Curl  
VBVisual Basic .NET

Visual Basic .NET is an object-oriented computer language that can be viewed as an evolution of Microsoft's Visual Basic imp...
 v9
 
HaskellHaskell (programming language)

Haskell is a standardized pure functional programming language with non-strict semantics, named after the logician Haskell C...
  
JavaJava (programming language)

Java is an object-oriented programming language developed by James Gosling and colleagues at Sun Microsystems in the early 1...
  
JavaScriptJavaScript

JavaScript is the name of Netscape Communications Corporation's implementation of ECMAScript, a scripting programming langua...
 
Lisp  
Lua 
all ML languages
(OCaml, Standard MLStandard ML

Standard ML is a general-purpose, modular, functional programming language with compile-time type checking and type inferenc...
, etc.)
  
PerlPerl

Perl, also Practical Extraction and Report Language is a dynamic procedural programming language designed by Larry Wa...
  
PythonPython (programming language)

Python is a programming language created by Guido van Rossum in 1990....
  
PHPFacts About PHP

* Paamayim Nekudotayim* Standard PHP Library...
  
RubyRuby (programming language)

Ruby is a reflective, object-oriented programming language....
  
Scheme  


† — C# support for anonymous functions currently employs the creation of a static function within the class. This means anonymous function support is a convenient facade presented by the compiler while the created anonymous function is really just a named static function (with a semi-random name) and thus not a real anonymous function. What this ultimately means is that anonymous functions are not dynamically created and executed like in, say, JavaScript.

Examples

Numerous languages support anonymous functions, or something similar.

C#

Support for anonymous functions in C# has deepened through the various versions of the language compiler. The C# Language v3.0, released in November 2007 with the .NET Framework v3.5, has full support of anonymous functions. The term for it in C# is "lambda expressions". See the , section 5.3.3.29, for more information.


Func foo = (x) => ;
Console.WriteLine(foo(7));


While the function is anonymous, the type is explicit. C# 3.0 does include implicitly typed variables, but because the lambda syntax may be used to denote an anonymous function or an expression tree, the type cannot automatically be inferred by the compiler, and therefore lambda expressions cannot be assigned to implicitly typed variables. Eg,this does not work:

// will NOT compile!
var foo = (x) => ;
Console.WriteLine(foo(7));


As a further example, combining anonymous functions with the Map capability available with System.Collections.Generic.List (in the ConvertAll method) looks like this:

// Initialize the list:
System.Collections.Generic.List Values = new System.Collections.Generic.List ;
// Map the anonymous function over all elements in the list, return the new list
var foo = Values.ConvertAll((d) => ) ;
// the result of the foo variable is of type System.Collections.Generic.List


Prior versions of C# had more limited support for anonymous functions.
C# v1.0, introduced in February 2002 with the .NET Framework v1.0, provided partial anonymous function support through the use of delegatesDelegate (.NET)

In computer science, delegate is a form of type-safe function pointer used in the .NET Framework technology developed by Mic...
. This construct is somewhat similar to PHP delegates. In C# 1.0, Delegates are like function pointers that refer to an explicitly named method within a class. (but unlike PHP the name is not required at the time the delegate is used.) C# v2.0, released in November 2005 with the .NET Framework v2.0, introduced the concept of anonymous methods as a way to write unnamed inline statement blocks that can be executed in a delegate invocation. C# 3.0 continues to support these constructs, but also supports the lambda expression construct.

This example will compile in C# 3.0, and exhibits the three forms:


public class TestDriver



In the case of the C# 2.0 version, the C# compiler takes the code block of the anonymous function and creates a static private function. Internally, the function gets a generated name, of course; this generated name is based on the name of the method in which the Delegate is declared. But the name is never exposed to application code.

In the case of the C# 3.0 version, the same mechanism applies.

JavaScript

JavaScriptJavaScript

JavaScript is the name of Netscape Communications Corporation's implementation of ECMAScript, a scripting programming langua...
 supports anonymous functions.

var foo = function(x)
alert(foo(10));


Unlike Python, anonymous functions in JavaScript are just like named functions and are declared just like named functions - in fact, all functions are implemented in the same way as anonymous functions, only sometimes with slightly different semantics (e.g. function foo(x) is the same as foo given above).

Lisp

Lisp supports anonymous functions.

(lambda (arg) (* arg arg))

Lua

In Lua all functions are anonymous. A "function name" in Lua is actually a variable that holds the respective function
.

Thus, in Lua

function foo (x) return 2*x end

is just syntactical sugar for

foo = function (x) return 2*x end


An example of using anonymous functions for reverse-order sorting:

table.sort(network, function (a,b)
return (a.name > b.name)
end)

Perl

PerlPerl

Perl, also Practical Extraction and Report Language is a dynamic procedural programming language designed by Larry Wa...
 supports anonymous functions, as follows:

(sub )->; # 1. fully anonymous, called as created

my $squarer = sub ; # 2. assigned to a variable

sub curry (&@)

  1. example of currying in Perl

sub sum # returns the sum of its arguments
my $curried = curry \&sum, 5, 7, 9;
print $curried->(1,2,3), "\n"; # prints 27 ( = 5 + 7 + 9 + 1 + 2 + 3 )


Other constructs take "bare blocks" as arguments, which serve a function similar to lambda functions of a single parameter, but don't have the same parameter-passing convention as functions -- @_ is not set.


my @squares = map 1..10; # map and grep don't use the 'sub' keyword
my @square2 = map $_ * $_, 1..10; # parentheses not required for a single expression

my @bad_example = map 1..10; # values not passed like normal Perl function

PHP

PHPPHP

* Paamayim Nekudotayim* Standard PHP Library...
 doesn't have true anonymous functions because the only way to reference functions is by name. The closest PHP is shown in the following.

$foo = create_function('$x', 'return $x*$x;');
$bar = create_function("\$x", "return \$x*\$x;");
echo $foo(10);


As of 5.2.5, the contents of $foo is a string of the form "\0lambda_X" where \0 is a null character (ASCII value zero) and X is a number starting with one.

It is important to note that the argument list and function body must be in single quotes or the dollar signs must be escaped.
Otherwise PHP will assume "$x" means the variable $x and will substitute it into the string (despite possibly not existing) instead of leaving "$x" in the string.
For functions with quotes or functions with lots of variables, it can get quite tedious to ensure the intended function body is what PHP interprets.

Python

PythonPython (programming language)

Python is a programming language created by Guido van Rossum in 1990....
 supports anonymous functions through the lambda form. It is, however, expected to be only a single line of code and always returns whatever that line returns. For example:

foo = lambda x: x*x
print foo(10)


The lambda function always returns x*x and there is no way for a lambda function to not return something. This makes anonymous functions limited and are not simply nameless functions.

Visual Basic

VBVisual Basic .NET

Visual Basic .NET is an object-oriented computer language that can be viewed as an evolution of Microsoft's Visual Basic imp...
 v9, introduced in November 2007, supports anonymous functions through the lambda form. Combined with implicit typing, VB provides an economical syntax for anonymous functions. As with Python, in VB v9, anonymous functions must be defined on a single line; they cannot be compound statements. Further, an anonymous function in VB must truly be a VB "Function" - it must return a value.

Dim foo = Function(x) x * x
Console.WriteLine(foo(10))