Come posso pronunciare "=>" come usato nelle espressioni lambda in .Net


160

Molto raramente incontro altri programmatori!

Il mio pensiero quando ho visto il token per la prima volta era "implica che" poiché è quello che lo avrebbe letto come in una prova matematica, ma chiaramente non ha senso.

Quindi, come posso dire o leggere "=>" come in: -

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

O esiste un modo concordato per dirlo?


6
120 voti positivi sono piuttosto notevoli per una domanda chiusa.
datazione

Tendo sempre a pronunciare è "implica" come l'operatore dello stesso aspetto nella logica.
IllidanS4 vuole che Monica ritorni il

Risposte:


149

Di solito dico "tale" quando leggo quell'operatore.

Nel tuo esempio, p => p.Age> 16 è "P, tale che p.Age è maggiore di 16."

In effetti, ho posto questa domanda sui forum pre-release ufficiali di linq e Anders Hejlsberg ha risposto dicendo

Di solito leggo l'operatore => come "diventa" o "per cui". Ad esempio,
Func f = x => x * 2;
Func test = c => c.City == "London";
legge "x diventa x * 2" e "c per cui c.City è uguale a Londra"

Per quanto riguarda "va a", non ha mai avuto senso per me. 'p' non sta andando da nessuna parte.

Nel caso di leggere il codice a qualcuno, diciamo, per telefono, quindi fintanto che sono un collega programmatore C #, userò semplicemente la parola "lambda", cioè "p lambda p dot age maggiore di sedici."

Nei commenti Steve Jessop ha menzionato "mappe a" nel caso delle trasformazioni, prendendo così l'esempio di Anders:

x => x * 2;

leggerebbe

x è mappato a x volte 2.

Ciò sembra molto più vicino all'intenzione reale del codice che "diventa" per questo caso.


1
Questo è preciso solo quando la lambda viene utilizzata come filtro.
Andru Luvisi,

4
"Goes to" è un rendering meno imbarazzante di "popola lo stack frame di"
Peter Wone,

1
Non mi piace molto "x diventa x * 2"; x è un input e rimane lo stesso per tutto. Leggerlo in questo modo sembra un'operazione di assegnazione.
Germán,

@Peter - hah, molto vero. =) @ Germán - Tendo ad essere d'accordo, anche se non riesco a pensare a un esempio migliore per le trasformazioni. Forse "si trasforma in"?
Erik Forbes,

5
Direi "mappe per" in quel caso. C'è quindi un leggero rischio che le persone pensino che tu stia parlando di un container, ma puoi chiarirlo spiegando la prima volta che lo dici, che ciò che vuoi dire è "l'operatore lambda, sai, uguale a segno-maggiore-maggiore- di".
Steve Jessop,

56

Da MSDN :

Tutte le espressioni lambda usano l'operatore lambda =>, che viene letto come "va a".


7
Intersting. Forse più interessante è che era vero per la versione VS2010 , ma la guida è stata rimossa dalla versione VS2012 .
Blair Conrad,

@BlairConrad - forse vero quando hai scritto il tuo commento, ma è lì per tutte le attuali versioni VS.
cp.gr

Non vedo più le parole "va a" nella documentazione MSDN collegata nella risposta sopra. Ricordo intorno al 2010 un mentore che mi diceva che la funzione lambda dovrebbe essere letta come "va a" ed è così che l'ho sempre letta. Tuttavia, inciampare in questa domanda, leggendola come "tale che" ha più senso per me.
matt.fc

18

Lettura del codice al telefono

Da Eric Lippert:

Personalmente direi c => c + 1 come "vedi va vedere più uno". Alcune variazioni che ho sentito:

Per una proiezione, (Cliente c) => c.Name: "cliente vedere diventa vedere nome punto"

Per un predicato, (Cliente c) => c.Age> 21: "il cliente vede tale che vedere l'età dei punti è maggiore di ventuno"


"Goes to" è stata la frase che ho sentito di più quando ho lavorato sui team LINQ.
Damiano

15

L'ho sempre chiamato "operatore wang" :-)

"età p maggiore di 16 anni"


10
Questo è Numberwang!
comichael

4
Devi dirmi dove altro sul pianeta qualcuno chiama questo "wang". Ho avuto un membro del team che mi ha detto che era un "wang" e l'unico posto su Internetz che nessuno di noi può trovare è su questa risposta.
Kristopher

1
@Wartickler Vengo dall'Australia occidentale - l'ho sempre chiamato l'operatore wang :-)
Aidos,

7

Ho visto persone dire "Freccia".


6
Spero sia uno scherzo.
Jacob Carpenter,

Non lo è - ho visto lo stesso.
Erik Forbes,

1
Penso che le persone che dicono "freccia" significhino questo: ->
Dour High Arch,

6
Non l'ho mai visto. L'ho sentito, forse, ma non visto.
ctacke

La freccia mi sembra ragionevole poiché significava rappresentare il segno della freccia dal calcolo lambda. Ho sentito tipi accademici chiamarlo freccia o freccia destra, ho visto il codice Haskell su diapositive in lattice con l'operatore -> modificato in un simbolo freccia.
Robert,


5

Che ne dici di "mappe per"? È sia sintetico che discutibilmente più tecnicamente accurato (cioè nessun suggerimento di un cambio di stato come con "va a" o "diventa", nessuna conflazione di un insieme con la sua funzione caratteristica come con "tale che" o "per cui") rispetto al altre alternative. Sebbene se c'è già uno standard come sembra implicare la pagina MSDN, forse dovresti semplicemente andare con quello (almeno per il codice C #).


3

"Maps to" è la mia pronuncia preferita. Matematicamente parlando, una funzione "mappa" i suoi argomenti al suo valore di ritorno (si potrebbe persino chiamare la funzione una "mappatura"), quindi per me ha senso usare questa terminologia nella programmazione, in particolare come programmazione funzionale (specialmente il calcolo lambda) è molto vicino alla matematica. È anche più neutrale di "diventa", "va a", ecc., Poiché non suggerisce un cambio di stato, come menzionato senza contesto.


2

Non ci ho pensato molto, ma dico semplicemente "a". E 'breve e conciso, e implica che la variabile viene passata al l'espressione. Suppongo che potrebbe essere confuso con il numero 2 ("due"), ma tendo a pronunciare "a" più come "ta" quando si parla. Nessuno (che conosce almeno i lambda) mi ha mai detto di aver pensato che fosse ambiguo ...

// "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"

2

La mia breve risposta: "c 'lambda-di' e". Sebbene mi aggrappi a "'lambda' c 'function' e", penso che lambda-of sia il compromesso ecumenico. Segue l'analisi.

Questa è un'ottima domanda se non altro per le risposte bizzarre. La maggior parte delle traduzioni ha altri significati rispetto alle espressioni lambda, portando a interpretazioni esotiche. Come un vecchio hacker di espressioni lambda, ignoro semplicemente la notazione .NET e la riscrivo come lambda nella mia testa, desiderando che avessero fatto quasi qualsiasi altra cosa per questo.


Per narrare il codice al telefono, vuoi che qualcuno sia in grado di scrivere il codice in sequenza. Questo è un problema, ovviamente, ma lambda-freccia o qualcosa è probabilmente il migliore che puoi ottenere, o forse lambda-in, ma lambda-of è il più preciso.

Il problema è l'uso dell'infisso e come nominare l'intera cosa e il ruolo delle parti sinistra e destra con qualcosa che funziona quando viene parlato al posto dell'infisso.

Questo potrebbe essere un problema troppo limitato!


Non userei "tale" perché ciò implica che il lato destro è un predicato che il lato sinistro dovrebbe soddisfare. Questo è molto diverso dal parlare di un lato destro da cui il lato sinistro è stato sottratto come parametro funzionale. (L'affermazione MSDN su "Tutte le espressioni lambda" è semplicemente offensiva e inaccurata.)

Qualcosa di "va a" anche se può essere il più vicino possibile. "Va a" implica una trasformazione, ma non esiste esattamente una variabile c che vada a un'espressione in c. L'astrazione per una funzione è un po 'sfuggente. Potrei abituarmi a questo, ma desidero ancora qualcosa che enfatizzi l'astrazione della variabile.

Dato che il lato sinistro è sempre un semplice identificatore nei casi utilizzati finora [ma aspetto estensioni che potrebbero confonderlo in seguito], penso che "c => espressione" leggerei "c 'funzione lambda-funzione" "'o anche" c' arg '' funzione 'espressione ". Nell'ultimo caso, potrei quindi dire cose come "b 'arg' c 'arg' 'funzione' espressione".

Potrebbe essere meglio chiarire che viene introdotta un'espressione lambda e dire qualcosa come "espressione '' arg 'b' arg 'c' function ''.

Capire come tradurre tutto questo in altre lingue è un esercizio per lo studente [; <).

Mi preoccupo ancora di "(b, c) => espressione" e di altre varianti che potrebbero nascere se non lo sono già. Forse "'args' b, c 'funzione' espressione".


Dopo tutto questo riflettere, noto che sto arrivando a tradurre "c => e" come "'lambda' c 'function' e" e notando che la mappatura alla forma esatta deve essere compresa dal contesto: λc (e ), c => e, f dove f (c) = e, ecc.

Mi aspetto che la spiegazione del "go to to" prevarrà semplicemente perché è qui che la maggioranza dominante vedrà le espressioni lambda per la prima volta. È un peccato. Un buon compromesso potrebbe essere "c ' lambda-of ' e"


1
'' Non userei "tale che" perché ciò implica che il lato destro è un predicato '' - quando viene usato come predicato, questa è una traduzione valida, a meno che non ti fraintenda.
Erik Forbes,

2

Se immagini un'espressione lambda come metodo anonimo, "va a" ha abbastanza senso.

(n => n == String.Empty)

n "va a" l'espressione n == String.Empty.

Va al metodo anonimo, quindi non devi andare al metodo nel codice!

Scusa per quello.

Onestamente, non mi piace usare "va a" nella mia testa, ma ho visto altre persone dire che sembrava strano, e ho pensato di chiarirlo.


2

Oltre ad acquisire l'ambito precedente (tutte le variabili e le costanti che sono nell'ambito di una normale riga di codice nel punto in cui si verifica un'espressione lambda sono disponibili per il codice dell'espressione) un'espressione lambda è essenzialmente zucchero sintattico per una funzione inline.

L'elenco di valori a sinistra dell'operatore di produzione ("=>") contribuisce alla struttura e al contenuto del frame dello stack utilizzato per effettuare la chiamata a questa funzione. Si potrebbe dire che l'elenco dei valori contribuisce sia alle dichiarazioni dei parametri sia agli argomenti che vengono passati; nel codice più convenzionale determinano la struttura e il contenuto del frame dello stack utilizzato per effettuare la chiamata a una funzione.

Di conseguenza, i valori "vanno a" il codice dell'espressione. Preferiresti dire "definisce il frame dello stack per" o "va a"? :)

Nell'applicazione strettamente definita delle espressioni booleane utilizzate come condizioni di filtro (un uso dominante delle espressioni lambda ampiamente considerato da altre risposte a questa domanda) è molto ragionevole saltare il metodo a favore dell'intento del codice e questo porta a " per cui "essere altrettanto concisi e dire di più sul significato del codice.

Tuttavia, le espressioni lambda non sono l'unica provincia di Linq e al di fuori di questo contesto dovrebbe essere usata la forma più generale "va a".


Ma perché "va a"?

Perché "popola il frame dello stack del seguente codice" è troppo lungo per continuare a dirlo. Suppongo che potresti dire "è / sono passato a".

Una differenza cruciale tra parametri passati esplicitamente e variabili acquisite (se ricordo bene, correggimi se sbaglio) è che i primi sono passati per riferimento e i secondi per valore.


1
Non vedo esattamente come le tue conclusioni derivino dalla tua discussione. D'altra parte, penso che caratterizzare => in termini di come le chiusure potrebbero essere (o no) implementate non sia un buon modo per venire a patti con la domanda che viene posta.
orcmid

Il primo paragrafo è fuorviante. Le espressioni lambda sono costrutti di prima classe. L'allineamento delle funzioni è un'ottimizzazione. L'ultimo paragrafo lo è ancora di più. Le variabili associate in espressioni lambda (quelle che chiamate "variabili acquisite") non vengono trasmesse da nessuna parte. Sono inscatolati e aggiunti come parte dell'oggetto lambda. Se fossero passati, dovresti nominarli di nuovo - per menzionare una differenza.
Neowizard,

1

Parte del problema è che puoi leggerlo ad alta voce in modo diverso a seconda di come è strutturato. È un peccato che non sia così bello o integrato come quello di Ruby.


Come si dice |? Come la pipa?
dtc

Difficile trovare una guida su questo, ma _why usa "take each", cioè People.each {| person | mette person.name} diventa "Con le persone prendi ogni persona e stampa il nome"
Adam Lassek il

1

In Ruby, questo stesso sybmol si chiama "hashrocket" e ho sentito che anche i programmatori C # usano quel termine (anche se farlo è sbagliato).


0

I miei due centesimi:

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

"Espressione lambda con parametro s è { return s.Age > 12 && s.Age < 20;}"

Mi piace perché mi ricorda da dove viene l'espressione lamdba

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

=> è solo una scorciatoia, quindi non è necessario utilizzare la parola chiave delegata e includere le informazioni sul tipo poiché può essere dedotto dal compilatore.


0

Il mio termine per => applicato agli esempi mostrati risulta

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

s dove s.Age è maggiore di 12 e s.Age meno di 20

'result = x => x * 2'

x dove x viene moltiplicato per 2

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

c dove c.city è equivalente a "London"

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

n dove n è una stringa vuota

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.