eugrita, когда ты записываешь f(a), f - это имя функции. Т.е. это обычная функция, не лямбда. Лямбда - это анонимная функция без имени, у которой само тело функции где написано, там и вызывается сходу.
Можно на примере JavaScript:
// Обычная функция
function f(a) { WScript.Echo(a); }
// Вызов обычной функции.
f("Hello world");
// Лямбда-функция, сохранённая в переменной, ведёт себя как обычная функция.
var g = function(a) { WScript.Echo(a); }
// Вызов функции.
g("Hello world");
// Чистая лямбда-функция: вызывается тут же в месте её описания.
(function(a) { WScript.Echo(a); })("Hello world");
Зачем это нужно.
В .NET лямбда-функции обычно используются во втором смысле. Т.е. аргументом какого-то метода может быть функция. Если эта функция-аргумент простая, нет смысла описывать её отдельно, достаточно вставить её тело прямо в параметр, поэтому используется лямбда-функция.
// Функция, принимающая параметром другую функцию.
function loop(func) { for(var i = 0; i < 10; ++i) { func(i); } }
// Вызов цикла с лямбда-функцией в качестве аргумента.
// Тут мы решаем, что будем делать с i.
loop(function(i) { WScript.Echo(i); });
Кроме того в функциональных языках лямбда-функции используются как аналог области видимости переменных и для объявления переменных. Например:
// Значение результата длительного и тяжёлого расчёта hardCalculation() используется несколько раз.
// Написать hardCalculation() * hardCalculation() заведомо невыгодно - будет вдвое медленнее работать.
// Можно либо использовать локальную переменную в алгоритмическом стиле
// var x = hardCalculation();
// Либо в функциональном стиле описать лямбда-функцию.
(function(x) { WScript.Echo(x * x); })(hardCalculation());
// Преимущество лямбда-функции в том, что область видимости переменной x ограничена только телом лямбда-функции.