The main problem with regular functions is that they cannot be passed around, since polymorphism makes it really difficult. In order to have first class functions you have to use **lambda expressions**. They work like this: ## Syntax The syntax to create lambda expression is as follows: ``` [captures](arg_1: Type_1, arg_2: Type_2, ...) -> ReturnType { [body] }; // With inferred return type [captures](arg_1: Type_1, arg_2: Type_2, ...) { [body] }; // Direct return [captures](arg_1: Type_1, arg_2: Type_2, ...) expression; ``` **Captures** are optional. ## Using them In terms of functionality, they are the same as regular functions. Here is an example: ``` let double = (i: Int) i * 2; print(double(4)); // Prints 8 ``` If you want to access data outside the context of the lambda expression, you can use **captures** (you can only capture variables, not expressions): ``` let i = -1; let count = [i]() { i.inc(); return *i; }; let c0 = count(); // 0 let c1 = count(); // 1 let c2 = count(); // 2 let c3 = count(); // 3 ``` Of course, you can also pass lambdas as function arguments as long as you use the correct type (see **function types**).