¿Cómo se pronuncia "=>" como se usa en las expresiones lambda en .Net

160

¡Muy raramente encuentro a otros programadores!

Mi pensamiento cuando vi el token por primera vez fue "implica que" ya que eso es lo que lo leería como en una prueba matemática, pero eso claramente no tiene sentido.

Entonces, ¿cómo digo o leo "=>" como en: -

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

¿O hay incluso una forma acordada de decirlo?

Christopher Edwards
fuente
66
120 votos positivos son bastante notables para una pregunta cerrada.
datps
Siempre tiendo a pronunciar es "implica" como el mismo operador lógico.
IllidanS4 quiere que Monica regrese el

Respuestas:

149

Usualmente digo 'tal que' cuando leo a ese operador.

En su ejemplo, p => p.Age> 16 se lee como "P, de modo que p.Age es mayor que 16."

De hecho, hice esta misma pregunta en los foros oficiales de prelanzamiento de linq, y Anders Hejlsberg respondió diciendo

Normalmente leo el operador => como "se convierte" o "para qué". Por ejemplo,
Func f = x => x * 2;
Func test = c => c.City == "Londres";
se lee como "x se convierte en x * 2" y "c para las cuales c.City es igual a Londres"

En cuanto a 'va', eso nunca tiene sentido para mí. 'p' no va a ninguna parte.

En el caso de leer el código a alguien, por ejemplo, por teléfono, entonces, siempre que sea un compañero programador de C #, solo usaría la palabra 'lambda', es decir, "p lambda p dot age mayor que dieciséis."

En los comentarios, Steve Jessop mencionó 'mapas para' en el caso de transformaciones, por lo que tomamos el ejemplo de Anders:

x => x * 2;

leería

x asigna a x veces 2.

Eso parece mucho más cercano a la intención real del código que 'se convierte' en este caso.

Erik Forbes
fuente
1
Eso solo es correcto cuando el lambda se usa como filtro.
Andru Luvisi, el
44
"Ir a" es una interpretación menos incómoda de "puebla el marco de la pila de"
Peter Wone
1
Realmente no me gusta "x se convierte en x * 2"; x es una entrada y permanece igual en todo momento. Leerlo de esa manera suena como una operación de asignación.
Germán el
@Peter - ja, muy cierto. =) @ Germán: tiendo a estar de acuerdo, aunque no puedo pensar en un mejor ejemplo para las transformaciones. Tal vez 'se transforma a'?
Erik Forbes
55
Yo diría "mapas a" en ese caso. Existe un ligero riesgo de que la gente piense que estás hablando de un contenedor, pero puedes aclararlo explicando la primera vez que lo dices, que lo que quieres decir es "el operador lambda, ya sabes, igual-signo-mayor- que".
Steve Jessop
56

De MSDN :

Todas las expresiones lambda usan el operador lambda =>, que se lee como "va a".

Kent Boogaart
fuente
77
Interesante Quizás lo más interesante es que era cierto para la versión VS2010 , pero la guía se ha eliminado de la versión VS2012 .
Blair Conrad
@BlairConrad: tal vez sea cierto cuando escribiste tu comentario, pero ahora está disponible para todas las versiones VS actuales.
cp.engr
Ya no veo las palabras "va a" en la documentación de MSDN vinculada en la respuesta anterior. Recuerdo que alrededor de 2010 un mentor me dijo que la función lambda debería leerse como "va a" y así es como siempre la he leído. Sin embargo, tropezar con esta pregunta y leerla como "tal que" tiene más sentido para mí.
matt.fc
18

Leer el código por teléfono

De Eric Lippert:

Yo personalmente diría c => c + 1 como "ver va a ver más uno". Algunas variaciones que he escuchado:

Para una proyección, (Cliente c) => c. Nombre: "ver cliente se convierte en ver nombre de punto"

Para un predicado, (Cliente c) => c. Edad> 21: "el cliente ve de modo que la edad del punto es mayor que veintiuno"

Gulzar Nazim
fuente
"Ir a" fue la frase que más escuché cuando trabajaba en los equipos LINQ.
DamienG
15

Siempre lo he llamado el "operador wang" :-)

"p wang edad de p mayor que 16"

Aidos
fuente
10
Eso es Numberwang!
comichael
44
Debes decirme en qué otro lugar del planeta alguien llama a esto "wang". Un miembro del equipo me dijo que era un "wang" y que el único lugar en Internet que cualquiera de nosotros puede encontrar es en esta respuesta.
Kristopher
1
@Wartickler Soy de Australia Occidental, siempre lo llamé el operador wang :-)
Aidos
7

He visto a gente decir "Flecha".

Brian
fuente
66
Espero que sea una broma.
Jacob Carpenter, el
No lo es, he visto lo mismo.
Erik Forbes
1
Creo que las personas que dicen "flecha" quieren decir esto: ->
Dour High Arch
66
Nunca he visto eso. Lo escuché, tal vez, pero no lo vi.
ctacke
La flecha me parece razonable, ya que significaba representar el signo de flecha del cálculo lambda. He escuchado que los tipos académicos lo llaman flecha o flecha derecha, he visto el código de Haskell en diapositivas de látex con el operador -> cambiado a un símbolo de flecha.
Robert
7

Yo uso "va a" porque un libro de LINQ me dijo que :)

CodeChef
fuente
5

¿Qué tal "mapas para"? Es a la vez sucinto y podría decirse que es técnicamente más preciso (es decir, no sugiere un cambio de estado como con "va a" o "se convierte", no se confunde un conjunto con su función característica como con "tal que" o "para qué") que el Otras alternativas. Aunque si ya hay un estándar como parece implicar la página de MSDN, tal vez deberías seguir con eso (al menos para el código C #).

Max Strini
fuente
3

"Maps to" es mi pronunciación preferida. Hablando matemáticamente, una función "mapea" sus argumentos a su valor de retorno (incluso se podría llamar a la función "mapeo"), por lo que tiene sentido para mí usar esta terminología en la programación, particularmente como programación funcional (especialmente el cálculo lambda) Está muy cerca de las matemáticas. También es más neutral que "se convierte", "va a", etc., ya que no sugiere un cambio de estado, como se menciona sin contexto.

Will Vousden
fuente
2

No lo he pensado mucho, pero solo digo sucintamente "a". Es breve y conciso, e implica que se pasa la variable a la expresión. Supongo que podría confundirse con el número 2 ("dos"), pero tiendo a pronunciar "a" más como "ta" cuando hablo. Nadie (que al menos conoce las lambdas) me ha dicho que lo consideraban 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"
Mark Brackett
fuente
2

Mi respuesta corta: "c 'lambda-of' e". Aunque me aferro a la "'lambda' c 'función' e '', creo que lambda-of es el compromiso ecuménico. El análisis sigue.

Esta es una gran pregunta, aunque solo sea por las respuestas extrañas. La mayoría de las traducciones tienen otros significados que las expresiones lambda, lo que lleva a interpretaciones exóticas. Como un viejo hacker de expresión lambda, simplemente ignoro la notación .NET y la reescribo como lambda en mi cabeza mientras deseo que hubieran hecho casi cualquier otra cosa por esto.


Para narrar el código por teléfono, desea que alguien pueda escribir el código en secuencia. Eso es un problema, por supuesto, pero la flecha lambda o algo así es probablemente lo mejor que puede obtener, o tal vez lambda-in, pero lambda-of es lo más preciso.

El problema es el uso de infijo y cómo nombrar todo y el papel de las partes izquierda y derecha con algo que funciona cuando se habla en el lugar infijo.

¡Esto puede ser un problema demasiado limitado!


No usaría "tal que" porque eso implica que el lado derecho es un predicado que el lado izquierdo debería satisfacer. Eso es muy diferente de hablar sobre un lado derecho del cual el lado izquierdo ha sido abstraído como un parámetro funcional. (La declaración de MSDN sobre "Todas las expresiones lambda" es simplemente ofensiva e inexacta).

Algo molesta sobre "va a" aunque puede ser lo más cercano que podamos llegar. "Ir a" implica una transformación, pero no hay exactamente alguna variable c que vaya a una expresión en c. La abstracción de una función es un poco esquiva. Podría acostumbrarme a esto, pero todavía anhelo algo que enfatice la abstracción de la variable.

Dado que el lado izquierdo es siempre un identificador simple en los casos utilizados hasta ahora [pero espere las extensiones que puedan confundir esto más adelante], creo que para "c => expresión", leería "c" función lambda-expresión "'o incluso" c' arg '' función 'expresión ". En el último caso, podría decir cosas como "b 'arg' c 'arg' 'function' expression".

Podría ser mejor dejar aún más claro que se está introduciendo una expresión lambda y decir algo así como "expresión 'arg' b 'arg' c 'función'.

Descubrir cómo traducir todo esto a otros idiomas es un ejercicio para el estudiante [; <).

Todavía me preocupo por "(b, c) => expresión" y otras variantes que pueden surgir si aún no lo han hecho. Quizás "'args' b, c 'función' expresión".


Después de toda esta reflexión, noto que voy a traducir "c => e" como "'lambda' c 'function' e" y me doy cuenta de que el mapeo a la forma exacta debe entenderse por contexto: λc (e ), c => e, f donde f (c) = e, etc.

Espero que la explicación de "ir a" prevalecerá simplemente porque aquí es donde una mayoría dominante verá las expresiones lambda por primera vez. Eso es una lástima. Un buen compromiso podría ser "c ' lambda-of ' e"

orcmid
fuente
1
"No usaría" tal que "porque eso implica que el lado derecho es un predicado" - cuando se usa como un predicado, entonces esta es una traducción válida, a menos que te malinterprete.
Erik Forbes
2

Si imagina una expresión lambda como el método anónimo que es, "va a" tiene bastante sentido.

(n => n == String.Empty)

n "va a" la expresión n == String.Empty.

Va al método anónimo, por lo que no tiene que ir al método en el código.

Lo siento por eso.

Honestamente, no me gusta usar "va a" en mi cabeza, pero vi a otras personas decir que parecía extraño, y pensé en aclararlo.

Jonesopolis
fuente
2

Además de adquirir el alcance anterior (todas las variables y constantes que están dentro del alcance de una línea de código normal en el punto donde se produce una expresión lambda están disponibles para el código de la expresión), una expresión lambda es esencialmente azúcar sintáctica para una función en línea.

La lista de valores a la izquierda del operador de producción ("=>") contribuye con la estructura y el contenido del marco de pila utilizado para realizar la llamada a esta función. Se podría decir que la lista de valores contribuye tanto con las declaraciones de parámetros como con los argumentos que se pasan; en un código más convencional, estos determinan la estructura y el contenido del marco de pila utilizado para realizar la llamada a una función.

Como resultado, los valores "van a" el código de expresión. ¿Prefieres decir "define el marco de la pila para" o "va a"? :)

En la aplicación estrechamente definida de expresiones booleanas utilizadas como condiciones de filtro (un uso dominante de expresiones lambda ampliamente considerado por otras respuestas a esta pregunta) es muy razonable omitir el método a favor de la intención del código, y esto lleva a " para lo cual "es tan sucinto y dice más sobre el significado del código.

Sin embargo, las expresiones lambda no son la única provincia de Linq y, fuera de este contexto, debe usarse la forma más general "va a".


¿Pero por qué "va a"?

Porque "llena el marco de la pila del siguiente código" es demasiado largo para seguir diciéndolo. Supongo que se podría decir "es / se pasa a".

Una diferencia crucial entre los parámetros pasados ​​explícitamente y las variables capturadas (si no recuerdo mal, corrígeme si me equivoco) es que los primeros se pasan por referencia y los segundos por valor.

Peter Wone
fuente
1
No veo exactamente cómo se deduce tu conclusión de tu discusión. Por otro lado, creo que caracterizar => en términos de cómo se pueden implementar (o no) los cierres no es una buena manera de comprender la pregunta que se hace.
orcmid
El primer párrafo es engañoso. Las expresiones lambda son construcciones de primera clase. La función en línea es una optimización. El último párrafo es aún más. Las variables enlazadas en expresiones lambda (lo que llama "variables capturadas") no se pasan a ningún lado. Se encuadran y se agregan como parte del objeto lambda. Si se aprobaron, tendría que nombrarlos nuevamente, por mencionar una diferencia.
Neowizard
1

Parte del problema es que puedes leerlo en voz alta de manera diferente dependiendo de cómo esté estructurado. Es una pena que no sea tan bonita o tan integrada como la de Ruby |.

Tad Donaghe
fuente
Como se dice ¿Igual que la tubería?
dtc
Es difícil encontrar una guía sobre esto, pero _por qué usa "tomar cada uno", es decir, People.each {| person | pone person.name} se convierte en "Con la gente toma a cada persona e imprime el nombre"
Adam Lassek
1

En Ruby, este mismo sybmol se llama "hashrocket", y he escuchado que los programadores de C # también usan ese término (aunque hacerlo es incorrecto).

Pharylon
fuente
0

Mis dos centavos:

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

"La expresión Lambda con el parámetro s es { return s.Age > 12 && s.Age < 20; }"

Me gusta esto porque me recuerda de dónde viene la expresión de lamdba

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

=> es solo un atajo para que no tenga que usar la palabra clave delegado e incluir la información de tipo, ya que el compilador puede inferirla.

Alano
fuente
0

Mi término para => como se aplica a los resultados mostrados ejemplos

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

s donde s. Edad es mayor que 12 y s. Edad menor que 20

'result = x => x * 2'

x donde x se multiplica por 2

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

c donde c.city es equivalente a "Londres"

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

n donde n es una cadena vacía

Arturo
fuente