Интервью: Что такое выражение Лямбды?

Недавно у меня было два телефонных интервью.

В обоих интервью меня спросили как последний вопрос определить выражение Лямбды.

Я утверждал, что выражение Lambda является неназванным методом вместо делегата. Но этого было недостаточно.

Мне очень сложно объяснить это именно в телефонном интервью.

Кто-нибудь знает лучше?

Ответ 1

Лямбда-выражения - это безымянные функции, заданные как постоянные значения. Они могут появляться в любом месте любой другой константы, но обычно записываются как параметр для какой-либо другой функции. Канонический пример состоит в том, что вы передадите функцию сравнения в общую подпрограмму "сортировка", и вместо того, чтобы затруднять определение целой функции (и нести лексическое разрывы и пространство имен), чтобы описать это сравнение, вы можете просто передать lambda выражение, описывающее сравнение.

ОДНАКО, это пропустит одну из самых важных особенностей Lambda Expressions, которая заключается в том, что они выполняются в контексте их внешнего вида. Поэтому они могут использовать значения переменных, которые определены в этом контексте. Это отличает функциональные указатели от истинных лямбда-выражений. В языках, поддерживающих изменяемые переменные, правильные лямбда-выражения дают возможность изменять значения этих переменных.

Лямбда-выражения появляются (с различным синтаксисом) во всех LISP, Perl, Python и достаточно последних версиях С++, Objective C, С# и Java 8, но особенно не в C, хотя у него есть способ справиться с передачей функции (или некоторое оправдание для них) вокруг как параметры. Они представляют собой синтаксический элемент с определенной семантикой, и эти семантики предъявляют больше требований к времени выполнения, чем требуется для C.

Ответ 2

Лямбда-выражение представляет собой безымянную приостановку кода.

Рассмотрим эту анонимную функцию "умножить две вещи" (выражение a.k.a. лямбда), используя некоторые очень неспецифические обозначения.

λ(x, y) -> x * y

Ваш ответ был очень специфичным для места, где вы использовали лямбда (я угадываю С#?), и я подозреваю, что интервьюер просил более общего понимания. Концепция делегата, язык С# и идея метода являются второстепенными по отношению к тому, что такое лямбда и как они работают. Вы можете вычислить, используя lambda-выражения на бумаге, например, без каких-либо методов.

Ответ 3

Возможно, они просто хотели услышать, что LINQ был "Language-Integrated Query".

Говоря, что если они действительно хотят объяснить "что" LINQ, я бы, вероятно, включил дополнительную информацию, которую вы предоставили. Что-то вроде:

LINQ или Language-Integrated Query - набор языковых добавлений и классов инфраструктуры, добавленных в .NET 3.5, которые позволяют более функциональный подход к операциям запроса. Он основан на методах расширения для IEnumerable и IQueryable и их общих аналогов, которые позволяют отсроченное выполнение в LINQ для объектов и удаленную обработку через IQueryable, а также многие другие функции. Были также внесены изменения языка в С# и VB.NET для поддержки более "естественного" синтаксиса запроса непосредственно на языке.

Ответ 4

Хорошо, я сказал, что Linq является неназванным методом вместо делегата.

Собственно, это не LINQ вообще, а "лямбда-выражение". И технически LINQ даже не использует их.

LINQ означает "Language Integrated Query". В частности, это "от... где.. выберите" ключевые слова (т.е. Синтаксис запроса, который интегрирован в язык).

Теперь, чтобы заставить это ключевое слово делать что-то, на язык (и CLR) добавлено гораздо больше (например, lambdas, методы расширения, класс Enumerable и т.д.).

Ответ 5

Чтобы ответить на ваш пересмотренный вопрос, для этого вы отвечаете на самом деле хорошо. Единственное изменение, которое я сделаю, это подчеркнуть слово "inline".

Выражение Lambda - это неназванный метод, который написан inline на месте где требуется делегат.

Ответ 7

Вероятно, они хотят узнать, что LINQ - это новый DSL для запросов объектов IQueryable и IEnumerable. Синтаксис "from... where... select..." по существу. Знание того, что оно реализовано под обложками с lambdas и функциональным стилем, вероятно, принесет вам бонусные очки.