Jak wymawiać „=>”, tak jak jest używane w wyrażeniach lambda w .Net

160

Bardzo rzadko spotykam innych programistów!

Kiedy po raz pierwszy zobaczyłem ten token, pomyślałem, że „implikuje to”, ponieważ tak by go odczytał jako dowód matematyczny, ale najwyraźniej nie ma to sensu.

Jak więc powiedzieć lub przeczytać "=>" jak w: -

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

A może jest w ogóle uzgodniony sposób powiedzenia tego?

Christopher Edwards
źródło
6
120 pozytywnych głosów to niezwykłe jak na pytanie zamknięte.
datps
Zawsze mam tendencję do wymawiania „implikuje” jako ten sam wyglądający operator w logice.
IllidanS4 chce, aby Monica wróciła

Odpowiedzi:

149

Zwykle mówię „takie, że” czytając ten operator.

W Twoim przykładzie p => p.Age> 16 oznacza „P, czyli p.Age jest większe niż 16”.

W rzeczywistości zadałem to pytanie na oficjalnych forach linq przed wydaniem, a Anders Hejlsberg odpowiedział, mówiąc

Zwykle czytam operator => jako „staje się” lub „dla którego”. Na przykład
Func f = x => x * 2;
Func test = c => c.City == "Londyn";
czyta jako „x staje się x * 2” i „c, dla którego c.City równa się London”

Jeśli chodzi o „idzie do” - to nigdy nie miało dla mnie sensu. „p” nigdzie się nie wybiera.

W przypadku czytania komuś kodu, powiedzmy, przez telefon, o ile jest to inny programista C #, użyłbym po prostu słowa „lambda” - to znaczy „p lambda p dot wiek większy niż szesnaście."

W komentarzach Steve Jessop wspomniał o `` mapach do '' w przypadku transformacji - na przykładzie Andersa:

x => x * 2;

przeczytałbym

x odwzorowuje x razy 2.

Wydaje się, że jest to znacznie bliższe rzeczywistej intencji kodu niż „staje się” w tym przypadku.

Erik Forbes
źródło
1
Jest to dokładne tylko wtedy, gdy lambda jest używana jako filtr.
Andru Luvisi,
4
„Goes to” to mniej niezręczne renderowanie „zapełnia ramkę stosu”
Peter Wone,
1
Naprawdę nie podoba mi się "x staje się x * 2"; x jest wartością wejściową i pozostaje taka sama przez cały czas. Czytanie tego w ten sposób brzmi jak operacja przypisania.
Germán
@Peter - hah, bardzo prawda. =) @ Germán - Zwykle się zgadzam, chociaż nie mogę wymyślić lepszego przykładu transformacji. Może „przekształca się w”?
Erik Forbes
5
W takim przypadku powiedziałbym „mapy do”. Istnieje zatem niewielkie ryzyko, że ludzie pomyślą, że mówisz o kontenerze, ale możesz to wyjaśnić, wyjaśniając, że za pierwszym razem, gdy to powiesz, masz na myśli „operator lambda, wiesz, równa się znak-większy- niż".
Steve Jessop
56

Z MSDN :

Wszystkie wyrażenia lambda używają operatora lambda =>, który jest odczytywany jako „idzie do”.

Kent Boogaart
źródło
7
Ciekawe. Być może bardziej interesujące jest to, że dotyczyło to wersji VS2010 , ale wskazówki zostały usunięte z wersji VS2012 .
Blair Conrad
@BlairConrad - może prawda, kiedy pisałeś swój komentarz, ale teraz jest dostępny dla wszystkich aktualnych wersji VS.
cp.engr
Nie widzę już słów „idzie do” w dokumentacji MSDN, do której link znajduje się w powyższej odpowiedzi. Pamiętam, że około 2010 roku mentor powiedział mi, że funkcję lambda należy czytać jako „idzie do” i tak zawsze ją czytałem. Natknąwszy się jednak na to pytanie, odczytanie go jako „takiego, który” ma dla mnie większy sens.
matt.fc
18

Czytanie kodu przez telefon

Od Erica Lipperta:

Osobiście powiedziałbym c => c + 1 jako „zobacz idzie zobaczyć plus jeden”. Kilka odmian, które słyszałem:

W przypadku projekcji (Klient c) => c.Nazwa: "klient widzi nazwę kropki"

W przypadku predykatu (Klient c) => c.Age> 21: "klient widzi taki, że wiek kropki jest większy niż dwadzieścia jeden"

Gulzar Nazim
źródło
„Goes to” to zwrot, który słyszałem najczęściej podczas pracy w zespołach LINQ.
DamienG,
15

Zawsze nazywałem to „operatorem wang” :-)

„wiek p większy niż 16”

Aidos
źródło
10
To jest Numberwang!
comichael
4
Musisz mi powiedzieć, gdzie jeszcze na planecie ktoś nazywa to „wang”. Jeden z członków zespołu powiedział mi, że to „wang” i jedyne miejsce w Internecie, które ktokolwiek z nas może znaleźć, to ta odpowiedź.
Kristopher,
1
@Wartickler Jestem z Australii Zachodniej - zawsze nazywałam to operatorem wang :-)
Aidos
7

Widziałem ludzi mówiących: „Arrow”.

Brian
źródło
6
Mam nadzieję, że to żart.
Jacob Carpenter
To nie jest - widziałem to samo.
Erik Forbes,
1
Myślę, że ludzie, którzy mówią „strzała”, mają na myśli to: ->
Dour High Arch
6
Nigdy tego nie widziałem. Może to słyszałem, ale nie widziałem.
ctacke
Strzałka wydaje mi się rozsądna, ponieważ miała przedstawiać znak strzałki z rachunku lambda. Słyszałem, jak akademicy nazywają to strzałką lub strzałką w prawo, widziałem kod Haskella na lateksowych slajdach z operatorem -> zmienionym na symbol strzałki.
Robert
7

Używam „idzie do”, ponieważ książka LINQ kazała mi :)

CodeChef
źródło
5

A co z „mapami do”? Jest zarówno zwięzły, jak i prawdopodobnie bardziej technicznie dokładny (tj. Nie ma sugestii zmiany stanu, jak w przypadku „idzie do” lub „staje się”, nie ma powiązania zbioru z jego charakterystyczną funkcją, jak z „taki, że” lub „dla którego”) niż inne alternatywy. Chociaż jeśli istnieje już standard, jak sugeruje strona MSDN, może powinieneś po prostu to zrobić (przynajmniej dla kodu C #).

Max Strini
źródło
3

„Mapy do” to moja preferowana wymowa. Mówiąc matematycznie, funkcja „odwzorowuje” swoje argumenty na zwracaną wartość (można by nawet nazwać tę funkcję „mapowaniem”), więc sensowne jest dla mnie używanie tej terminologii w programowaniu, szczególnie w programowaniu funkcyjnym (zwłaszcza w rachunku lambda) jest bardzo blisko matematyki. Jest również bardziej neutralny niż „staje się”, „idzie do” itp., Ponieważ nie sugeruje zmiany stanu, jak wspomniano bezkontekstowo.

Will Vousden
źródło
2

Nie myślałem o tym zbyt wiele, ale po prostu powiem, że „do”. Jest krótki i zwięzły oraz sugeruje, że zmienna jest przekazywana do wyrażenia. Przypuszczam, że można to pomylić z cyfrą 2 („dwa”), ale podczas mówienia mam tendencję do wymawiania „bardziej jak„ ta ”. Nikt (kto przynajmniej zna lambdy) nigdy mi nie powiedział, że uważa to za niejednoznaczne ...

// "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"
Mark Brackett
źródło
2

Moja krótka odpowiedź: „c 'lambda-of' e”. Chociaż lgnę do „lambda” c ”function„ e ”, myślę, że lambda-of jest ekumenicznym kompromisem. Analiza następuje.

To świetne pytanie, choćby ze względu na dziwaczne odpowiedzi. Większość tłumaczeń ma inne znaczenie niż wyrażenia lambda, co prowadzi do egzotycznych interpretacji. Jako stary haker wyrażający lambda po prostu ignoruję notację .NET i przepisuję ją na lambdę w mojej głowie, żałując, że nie zrobili w tym celu prawie niczego innego.


Aby móc opisywać kod przez telefon, chcesz, aby ktoś mógł zapisać kod po kolei. To jest oczywiście problem, ale strzałka lambda lub coś takiego jest prawdopodobnie najlepszą, jaką można uzyskać, albo może lambda-in, ale lambda-of jest najdokładniejsza.

Problemem jest użycie wrostka i to, jak nazwać całość i rolę lewej i prawej części czymś, co działa, gdy mówi się w miejscu wrostka.

To może być nadmiernie ograniczony problem!


Nie użyłbym „takiego, że”, ponieważ oznacza to, że prawa strona jest predykatem, który powinna spełniać lewa strona. To bardzo różni się od mówienia o prawej stronie, z której lewa strona została wyabstrahowana jako parametr funkcjonalny. (Oświadczenie MSDN dotyczące „Wszystkie wyrażenia lambda” jest po prostu obraźliwe i niedokładne).

Coś denerwuje w „zbliżaniu się”, chociaż może być tak blisko, jak to tylko możliwe. „Goes to” oznacza transformację, ale nie ma dokładnie takiej zmiennej c, która prowadzi do wyrażenia w c. Abstrakcja funkcji jest trochę nieuchwytna. Mógłbym się do tego przyzwyczaić, ale wciąż tęsknię za czymś, co podkreśli abstrakcję zmiennej.

Ponieważ lewa strona jest zawsze prostym identyfikatorem w dotychczas stosowanych przypadkach [ale poczekaj na rozszerzenia, które mogą to później zmylić], myślę, że dla wyrażenia "c =>" przeczytałbym wyrażenie "c" funkcja lambda " „” lub nawet „c” arg ”„ function ”expression”. W ostatnim przypadku mógłbym wtedy powiedzieć rzeczy takie jak „b 'arg' c 'arg' 'function' expression”.

Lepiej byłoby jeszcze bardziej wyjaśnić, że wprowadzane jest wyrażenie lambda i powiedzieć coś w rodzaju „'arg' b 'arg' c 'function' expression”.

Nauczenie się, jak przetłumaczyć to wszystko na inne języki, jest ćwiczeniem dla ucznia [; <).

Wciąż martwię się o "(b, c) => wyrażenie" i inne warianty, które mogą powstać, jeśli jeszcze tego nie zrobiły. Być może „'args' b, c 'wyrażenie funkcji'”.


Po tych wszystkich rozważaniach zauważam, że przechodzę do tłumaczenia „c => e” jako „'lambda' c 'function' e” i zauważam, że odwzorowanie na dokładną formę należy rozumieć w kontekście: λc (e ), c => e, f gdzie f (c) = e itd.

Spodziewam się, że wyjaśnienie „idzie do” przeważy po prostu dlatego, że w tym miejscu dominująca większość po raz pierwszy zobaczy wyrażenia lambda. Szkoda. Dobrym kompromisem może być „c ' lambda-of ' e”

orcmid
źródło
1
„Nie użyłbym„ takiego, że ”, ponieważ oznacza to, że prawa strona jest predykatem” - kiedy jest używany jako predykat, to jest to poprawne tłumaczenie, chyba że źle cię rozumiem.
Erik Forbes,
2

Jeśli wyobrażasz sobie wyrażenie lambda jako metodę anonimową, to „idzie do” ma wystarczająco sens.

(n => n == String.Empty)

n "idzie do" wyrażenia n == String.Empty.

Przechodzi do metody anonimowej, więc nie musisz przechodzić do metody w kodzie!

Przepraszam za to.

Szczerze mówiąc, nie lubię używać słowa „idzie do” w mojej głowie, ale widziałem, jak inni ludzie mówili, że to dziwne, i pomyślałem, że to wyjaśnię.

Jonesopolis
źródło
2

Oprócz uzyskania poprzedniego zakresu (wszystkie zmienne i stałe, które są objęte zakresem normalnego wiersza kodu w miejscu, w którym występuje wyrażenie lambda, są dostępne dla kodu wyrażenia), wyrażenie lambda jest zasadniczo cukrem syntaktycznym dla funkcji wbudowanej.

Lista wartości po lewej stronie operatora produkcji ("=>") wpływa na strukturę i zawartość ramki stosu używanej do wywołania tej funkcji. Można powiedzieć, że lista wartości wnosi wkład zarówno do deklaracji parametrów, jak i do przekazywanych argumentów; w bardziej konwencjonalnym kodzie określają one strukturę i zawartość ramki stosu używanej do wywołania funkcji.

W rezultacie wartości „przechodzą do” kodu wyrażenia. Czy wolisz powiedzieć „definiuje ramkę stosu dla” czy „idzie do”? :)

W wąsko zdefiniowanym zastosowaniu wyrażeń boolowskich używanych jako warunki filtrujące (dominujące użycie wyrażeń lambda szeroko rozważane w innych odpowiedziach na to pytanie) bardzo rozsądne jest pominięcie metody na korzyść intencji kodu, a to prowadzi do " dla których „jest tak samo zwięzły i mówi więcej o znaczeniu kodu.

Jednak wyrażenia lambda nie są jedyną domeną Linq i poza tym kontekstem należy używać bardziej ogólnej formy „idzie do”.


Ale dlaczego „idzie”?

Ponieważ „wypełnia ramkę stosu poniższego kodu” jest o wiele za długa, aby to powtarzać. Przypuszczam, że można powiedzieć „jest / są przekazywane do”.

Istotna różnica między jawnie przekazanymi parametrami a przechwyconymi zmiennymi (jeśli dobrze pamiętam - popraw mnie, jeśli się mylę) polega na tym, że te pierwsze są przekazywane przez odniesienie, a drugie przez wartość.

Peter Wone
źródło
1
Nie rozumiem dokładnie, jakie wnioski wynikają z dyskusji. Z drugiej strony, myślę, że scharakteryzowanie => w kategoriach tego, jak domknięcia mogą (lub nie) być zaimplementowane, nie jest dobrym sposobem na uporanie się z zadanym pytaniem.
orcmid
Pierwszy akapit wprowadza w błąd. Wyrażenia lambda są konstrukcjami pierwszej klasy. Funkcja inlining to optymalizacja. Jeszcze bardziej dotyczy to ostatniego akapitu. Powiązane zmienne w wyrażeniach lambda (tak zwane „przechwycone zmienne”) nie są nigdzie przekazywane. Są opakowane i dodane jako część obiektu lambda. Gdyby zostały zdane, musiałbyś nazwać je ponownie - żeby wspomnieć o jednej różnicy.
Neowizard
1

Częściowo problem polega na tym, że można go odczytać na głos w różny sposób, w zależności od jego struktury. Szkoda, że ​​nie jest tak ładny ani tak zintegrowany jak | Ruby's.

Tad Donaghe
źródło
Jak powiesz |? To samo co rura?
dtc
Trudno znaleźć jakikolwiek przewodnik na ten temat, ale _why używa wyrażenia „take each”, tj. People.each {| person | puts person.name} staje się „With People weź każdego i drukuj imię”
Adam Lassek
1

W Rubim ten sam sybmol nazywa się „hashrocket” i słyszałem, że programiści C # również używają tego terminu (nawet jeśli robienie tego jest złe).

Pharylon
źródło
0

Moje dwa centy:

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

„Wyrażenie lambda z parametrem s to { return s.Age > 12 && s.Age < 20;}”

Podoba mi się to, ponieważ przypomina mi, skąd pochodzi wyrażenie lamdba

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

=> to tylko skrót, więc nie musisz używać słowa kluczowego delegate i dołączać informacje o typie, ponieważ może to zostać wywnioskowane przez kompilator.

Allan
źródło
0

Mój termin dla => zastosowany do pokazanych przykładów

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

s, gdzie s. wiek jest większy niż 12 i s. mniejszy niż 20 lat

'result = x => x * 2'

x, gdzie x jest mnożone przez 2

'result = c => c.City == "London"'

c, gdzie c.city jest odpowiednikiem „Londynu”

'result = n => n == String.Empty'

n, gdzie n jest pustym łańcuchem

Arthur
źródło