Как произносится"=>", как используется в лямбда-выражениях in.Net

Я очень редко встречаю других программистов!

Итак, как я могу сказать или прочитать"=>", как в: -

IEnumerable<Person> Adults = people.Where(p => p.Age > 16)

или есть даже согласованный способ сказать это?

15 ответов


Я обычно говорю "такое, что" при чтении этого оператора.

в вашем примере p => p.Возраст > 16 читается как " P, такой, что p.Возраст старше 16 лет."

на самом деле, я задал этот самый вопрос на официальных форумах LINQ pre-release, и Андерс Хейлсберг ответил, сказав

Я обычно читаю оператор => как "будет" или "для чего". Например,
Func f = x => x * 2;
Тест Функ = с => В. Город == "Лондон";
гласит "x становится x * 2" и " c, для которого c.Город равен Лондону"

что касается "идет к" - это никогда не имело смысла для меня. "п" никуда не денется.

в комментариях Стив Джессоп упомянул "карты" в случае преобразований-так что Андерс" пример:

x => x * 2;

читал

X отображает x раз 2.

это кажется гораздо ближе к фактическому намерению кода, чем "становится" для этого случая.


с MSDN:

все лямбда-выражения лямбда оператор =>, который читается как "идет к."


чтение кода по телефону

От Эрика Липперта:

Я лично сказал бы c=>c+1 Как "см. Идет, чтобы увидеть плюс один". Некоторые вариации, которые я слышал:

для проекции, (клиент c)=>c.Имя: "клиент видит становится видеть имя точки"

для предиката (клиент c)=>c.Возраст > 21: "клиент видит такое, что видит возраст точки больше, чем двадцать один"


Я всегда называл его "оператором wang": -)

"P wang возраст p больше 16"


Я видел, как люди говорят, "со стрелками."


Я использую "идет", потому что книга LINQ сказала мне:)


Как насчет "карты"? Это и лаконично, и, возможно, более технически точно (т. е. нет предположения об изменении состояния, как с "идет" или "становится", нет слияния множества с его характеристической функцией, как с "таким, что" или "для которого"), чем другие альтернативы. Хотя, если уже есть стандарт, как показывает страница MSDN, возможно, вам следует просто пойти с этим (по крайней мере, для кода C#).


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


Я не думал об этом много, но я просто кратко говорю "к". Он короткий и сжатый и подразумевает, что переменная передается to выражение. Я полагаю, что его можно спутать с цифрой 2 ("два"), но я склонен произносить" to "больше похоже на" ta", когда говорю. Никто (кто знает лямбду, по крайней мере) никогда не говорил мне, что они считают это двусмысленным...

// "Func f equals x to x times two"
Func f = x=> x * 2;

// "Func test equals c to c dot City equals London"
Func test = c => c.City == "London"

мой короткий ответ:"c 'lambda-of' e". Хотя я цепляюсь за" лямбда " C "функция e", я думаю, что лямбда-это экуменический компромисс. Далее следует анализ.

Это отличный вопрос, если только для причудливых ответов. Большинство переводов имеют другие значения, чем для лямбда-выражений, что приводит к экзотическим интерпретациям. Как старый хакер лямбда-выражения, я просто игнорирую нотацию .NET и переписываю ее как лямбда в своей голове, желая, чтобы они сделали почти что-нибудь еще для этого.


для повествования кода по телефону, вы хотите, чтобы кто-то мог записать код в последовательности. Это, конечно, проблема, но лямбда-стрелка или что-то еще, вероятно, лучшее, что вы можете получить, или, может быть, лямбда-В, но лямбда-Из является наиболее точным.

проблема заключается в использовании инфикса и как назвать все это и роль левой и правой частей с чем-то, что работает, когда говорят в инфиксе место.

Это может быть чрезмерно ограниченная проблема!


Я бы не использовал "такое, что", потому что это означает, что правая сторона является предикатом, который левая сторона должна удовлетворять. Это очень отличается от разговора о правой стороне, из которой левая сторона абстрагирована как функциональный параметр. (Утверждение MSDN о "всех лямбда-выражениях" просто оскорбительно, а также неточно.)

Что-то раздражает "идет", хотя это может быть так близко, как мы можем сделать. "Идет к" подразумевает преобразование, но нет точно какой-то переменной c, которая идет к выражению в c. Абстракция функции несколько неуловима. Я мог бы привыкнуть к этому, но я все еще жажду чего-то, что подчеркивает абстракцию переменной.

поскольку левая сторона всегда является простым идентификатором в случаях, используемых до сих пор [но дождитесь расширений, которые могут запутать это позже], я думаю, для "c => expression" я бы прочитал "c' Lambda-function ' expression "или даже"c 'arg' 'function' expression". В последнем случае я мог бы сказать такие вещи, как"B' arg 'c' arg '' function 'expression".

возможно, было бы лучше сделать еще более ясным, что вводится лямбда-выражение и сказать что-то вроде "'arg' b 'arg' c 'function' expression".

выяснить, как перевести все это на другие языки-это упражнение для студента [;

Я все еще беспокоюсь о" (b, c) => expression " и других вариантах, которые могут возникнуть, если они еще не появились. Возможно, выражение"' args 'b, c' function'".


после всех этих размышлений я замечаю, что я прихожу к переводу "c => e" как "лямбда" C "функция" e " и замечаю, что отображение в точную форму должно пониматься контекстом: λc(e), c => e, f здесь f (c) = e и т. д.

Я ожидаю, что "идет-" объяснение будет преобладать просто потому, что именно здесь доминирующее большинство впервые увидит лямбда-выражения. Какая жалость. Хорошим компромиссом может быть "с 'лямда-о 'e"


Если вы представляете лямбда-выражение как анонимный метод, "идет" имеет достаточно приличный смысл.

(n => n == String.Empty)

n "переходит к" выражению N == String.Пустой.

он переходит к анонимному методу, поэтому вам не нужно переходить к методу в коде!

извиняюсь за это.


помимо получения предыдущей области (все переменные и константы, которые находятся в области для нормальной строки кода в точке, где происходит лямбда-выражение, доступны для кода выражения) лямбда-выражение по существу является синтаксическим сахаром для встроенной функции.

список значений слева от производственного оператора ( "= > " ) вносит структуру и содержимое кадра стека, используемого для вызова этой функции. Можно сказать, что список значения вносит как объявления параметров, так и аргументы, которые передаются; в более обычном коде они определяют структуру и содержимое фрейма стека, используемого для вызова функции.

в результате значения "перейти к" коду выражения. Вы бы предпочли сказать "определяет кадр стека для "или" идет к"? :)

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

однако лямбда-выражения не являются единственной областью Linq, и вне этого контекста следует использовать более общую форму "идет к".


но почему "идет" ?

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

решающее различие между явно переданными параметрами и захваченными переменными (если я правильно помню - исправьте меня, если я ошибаюсь) заключается в том, что первые передаются по ссылке, а последние по значению.


часть проблемы заключается в том, что вы можете прочитать его вслух по-разному в зависимости от того, как она структурирована. Жаль, что это не так красиво или интегрировано, как ruby's/.


в Ruby этот же sybmol называется "hashrocket", и я слышал, что программисты C# тоже используют этот термин (хотя это неправильно).


мои две копейки:

s => s.Age > 12 && s.Age < 20

" лямбда-выражение с параметром s равно { return s.Age > 12 && s.Age < 20; }"

мне нравится это, потому что это напоминает мне, откуда происходит выражение lamdba

delegate(Student s) { return s.Age > 12 && s.Age < 20; };

=> - это просто ярлык, поэтому вам не нужно использовать ключевое слово delegate и включать информацию о типе, поскольку она может быть выведена компилятором.