Como se pronuncia "=>" conforme usado nas expressões lambda no .Net

160

Eu raramente encontro outros programadores!

Meu pensamento, quando vi pela primeira vez, o token era "implica que", já que é isso que ele leria como uma prova matemática, mas que claramente não é o seu sentido.

Então, como digo ou leio "=>" como em: -

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

Ou existe mesmo uma maneira acordada de dizer isso?

Christopher Edwards
fonte
6
120 votos positivos são bastante notáveis ​​para uma pergunta encerrada.
datps 24/03
Eu sempre tendem a pronunciar "implica" como o mesmo operador de lógica.
IllidanS4 quer Monica volta

Respostas:

149

Eu costumo dizer 'tal que' ao ler esse operador.

No seu exemplo, p => p.Age> 16 é lido como "P, de modo que p.Age seja maior que 16."

De fato, fiz essa pergunta nos fóruns oficiais de pré-lançamento do linq, e Anders Hejlsberg respondeu dizendo:

Normalmente leio o operador => como "se torna" ou "para o qual". Por exemplo,
Func f = x => x * 2;
Teste Func = c => c.City == "London";
lê como "x se torna x * 2" e "c para o qual c.City é igual a Londres"

Tanto quanto 'vai para' - isso nunca fez sentido para mim. 'p' não vai a lugar nenhum.

No caso de ler código para alguém, digamos, por telefone, desde que seja um colega programador de C #, eu usaria a palavra 'lambda' - ou seja, "p lambda p dot age maior que dezesseis."

Nos comentários, Steve Jessop mencionou 'maps to' no caso de transformações - tomando o exemplo de Anders:

x => x * 2;

Iria ler

x mapeia x vezes 2.

Isso parece muito mais próximo da intenção real do código do que 'se torna' para este caso.

Erik Forbes
fonte
1
Isso é preciso apenas quando o lambda está sendo usado como um filtro.
Andru Luvisi
4
"Goes to" é uma renderização menos incômoda de "preenche o quadro de pilha de"
Peter Wone
1
Eu realmente não gosto de "x se torna x * 2"; x é uma entrada e permanece o mesmo o tempo todo. Lê-lo dessa maneira soa como uma operação de atribuição.
Germán
@ Peter - hah, muito verdadeiro. =) @ Germán - Costumo concordar, embora não consiga pensar em um exemplo melhor para transformações. Talvez 'se transforme em'?
Erik Forbes
5
Eu diria "mapeia para" nesse caso. Há um pequeno risco de as pessoas pensarem que você está falando sobre um contêiner, mas você pode esclarecer isso explicando a primeira vez que diz isso, que o que você quer dizer é "o operador lambda, você sabe, é igual a um sinal maior" do que".
9138 Steve Jessop
56

Do MSDN :

Todas as expressões lambda usam o operador lambda =>, que é lido como "vai para".

Kent Boogaart
fonte
7
Interessante. Talvez o mais interessante seja que isso aconteceu na versão VS2010 , mas as orientações foram removidas da versão VS2012 .
Blair Conrad
@BlairConrad - talvez seja verdade quando você escreveu seu comentário, mas existe para todas as versões atuais do VS agora.
cp.engr
Não vejo mais as palavras "vai para" na documentação do MSDN vinculada na resposta acima. Eu me lembro por volta de 2010 de um mentor me dizendo que a função lambda deveria ser lida como "vai para" e é assim que eu sempre a leio. Tropeçando nessa questão, no entanto, lê-la como "tal que" faz mais sentido para mim.
22418 Matt.fc #
18

Lendo código pelo telefone

De Eric Lippert:

Pessoalmente, eu diria que c => c + 1 como "veja vai ver mais um". Algumas variações que eu já ouvi:

Para uma projeção, (Cliente c) => c.Name: "o cliente vê se torna ver o nome do ponto"

Para um predicado, (Cliente c) => c.Idade> 21: "o cliente vê que a idade do ponto é maior que vinte e um"

Gulzar Nazim
fonte
"Vai para" foi a frase que mais ouvi ao trabalhar nas equipes do LINQ.
DamienG
15

Eu sempre o chamei de "operador wang" :-)

"p wang idade de p maior que 16"

Aidos
fonte
10
Esse é Numberwang!
Comichael
4
Você tem que me dizer em que outro lugar do planeta alguém chama isso de "wang". Um membro da equipe me disse que era uma "wang" e o único lugar na internet que qualquer um de nós pode encontrar está nesta resposta.
Kristopher
1
@Wartickler Eu sou da Austrália Ocidental - chamado sempre que o operador wang :-)
Aidos
7

Eu já vi pessoas dizerem "Arrow".

Brian
fonte
6
Espero que seja uma piada.
Jacob Carpenter
Não é - eu já vi o mesmo.
Erik Forbes
1
Acho que as pessoas que dizem "seta" significa o seguinte: ->
High Arch Dour
6
Eu nunca vi isso. Ouvi, talvez, mas não vi.
Ctacke
A seta parece razoável para mim, pois significava representar o sinal de seta do cálculo lambda. Ouvi os tipos acadêmicos chamarem de seta ou seta para a direita. Vi o código Haskell em slides de látex com o operador -> alterado para um símbolo de seta.
Robert
7

Eu uso "vai para" porque um livro do LINQ me disse para :)

CodeChef
fonte
5

Que tal "mapeia para"? É ao mesmo tempo sucinto e sem dúvida mais preciso tecnicamente (ou seja, nenhuma sugestão de mudança de estado como "vai para" ou "torna-se", nenhuma combinação de um conjunto com sua função característica como com "tal que" ou "para qual") do que o outras alternativas. Embora se já exista um padrão como a página do MSDN pareça sugerir, talvez você deva apenas segui-lo (pelo menos no código C #).

Max Strini
fonte
3

"Mapeia para" é minha pronúncia preferida. Matematicamente falando, uma função "mapeia" seus argumentos para seu valor de retorno (pode-se até chamar a função de "mapeamento"); portanto, faz sentido usar essa terminologia em programação, particularmente como programação funcional (especialmente o cálculo lambda) está muito perto da matemática. Também é mais neutro do que "torna-se", "vai para" etc., pois não sugere mudança de estado, como mencionado no contexto.

Will Vousden
fonte
2

Eu não pensei muito sobre isso, mas digo sucintamente "para". É curto e conciso, e implica que a variável é passada para a expressão. Suponho que possa ser confundido com o número 2 ("dois"), mas costumo pronunciar "para" mais como "ta" ao falar. Ninguém (que conhece lambdas, pelo menos) jamais me disse que achava ambíguo ...

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

Minha resposta curta: "c 'lambda-of' e". Embora eu me apegue à "função lambda 'c' 'e", acho que lambda-of é o compromisso ecumênico. A análise segue.

Essa é uma ótima pergunta, apenas pelas respostas bizarras. A maioria das traduções tem outros significados que não as expressões lambda, levando a interpretações exóticas. Como um antigo hacker de expressão lambda, simplesmente ignoro a notação .NET e a reescrevo como lambda na minha cabeça, desejando que eles tivessem feito quase qualquer outra coisa para isso.


Para narrar o código pelo telefone, você deseja que alguém seja capaz de escrever o código em sequência. Isso é um problema, é claro, mas a seta lambda ou algo é provavelmente o melhor que você pode obter, ou talvez a entrada lambda, mas a lambda-of é a mais precisa.

O problema é o uso do infixo e como nomear a coisa toda e o papel das partes esquerda e direita com algo que funciona quando falado no local do infixo.

Este pode ser um problema excessivamente restrito!


Eu não usaria "tal que" porque isso implica que o lado direito é um predicado que o lado esquerdo deve satisfazer. Isso é muito diferente de falar sobre o lado direito do qual o lado esquerdo foi abstraído como um parâmetro funcional. (A declaração do MSDN sobre "Todas as expressões lambda" é simplesmente ofensiva e imprecisa.)

Algo incomoda sobre "vai para", embora possa ser o mais próximo possível. "Vai para" implica uma transformação, mas não há exatamente alguma variável c que vá para uma expressão em c. A abstração de uma função é um pouco ilusória. Eu poderia me acostumar com isso, mas ainda anseio por algo que enfatize a abstração da variável.

Como o lado esquerdo é sempre um identificador simples nos casos usados ​​até o momento [mas espere por extensões que possam confundir isso mais tarde], penso em "c => expression" eu leria "c 'lambda-function' expression "'ou mesmo" c' arg '' função 'expressão ". No último caso, eu poderia dizer coisas como "b 'arg' c 'arg' 'function' expression".

Talvez seja melhor deixar ainda mais claro que uma expressão lambda está sendo introduzida e dizer algo como "expressão 'arg' b 'arg' c 'function'".

Descobrir como traduzir tudo isso para outros idiomas é um exercício para o aluno [; <).

Eu ainda me preocupo com "(b, c) => expressão" e outras variantes que podem surgir se ainda não o foram. Talvez "'args' b, c 'function' expression".


Depois de toda essa reflexão, percebo que estou traduzindo "c => e" como "'função lambda' c '' e" e percebendo que o mapeamento para a forma exata deve ser entendido pelo contexto: λc (e ), c => e, f em que f (c) = e, etc.

Espero que a explicação "vá para" prevaleça simplesmente porque é aqui que a maioria dominante verá expressões lambda pela primeira vez. É uma pena. Um bom compromisso pode ser "c ' lambda-of ' e"

orcmid
fonte
1
'' Eu não usaria "tal que" porque isso implica que o lado direito é um predicado '' - quando está sendo usado como predicado, então esta é uma tradução válida, a menos que eu esteja entendendo mal você.
Erik Forbes
2

Se você imaginar uma expressão lambda como o método anônimo, "vai para" faz bastante sentido.

(n => n == String.Empty)

n "vai para" a expressão n == String.Empty.

Ele vai para o método anônimo, para que você não precise ir para o método no código!

Desculpe por isso.

Honestamente, eu não gosto de usar "vai para" na minha cabeça, mas vi outras pessoas dizendo que pareciam estranhas e pensei em esclarecer isso.

Jonesopolis
fonte
2

Além de adquirir o escopo anterior (todas as variáveis ​​e constantes que estão no escopo de uma linha de código normal no ponto em que ocorre uma expressão lambda estão disponíveis para o código da expressão), uma expressão lambda é essencialmente um açúcar sintático para uma função em linha.

A lista de valores à esquerda do operador de produção ("=>") contribui com a estrutura e o conteúdo do quadro de pilha usado para fazer a chamada para esta função. Você poderia dizer que a lista de valores contribui com as declarações de parâmetro e os argumentos passados; em código mais convencional, eles determinam a estrutura e o conteúdo do quadro de pilha usado para fazer a chamada para uma função.

Como resultado, os valores "vão para" o código da expressão. Você prefere dizer "define o quadro da pilha para" ou "vai para"? :)

Na aplicação estritamente definida de expressões booleanas usadas como condições de filtro (um uso dominante de expressões lambda amplamente consideradas por outras respostas a essa pergunta), é muito razoável ignorar o método em favor da intenção do código, e isso leva a " para o qual "ser tão sucinto e dizer mais sobre o significado do código.

No entanto, as expressões lambda não são a única província do Linq e, fora desse contexto, a forma mais geral "vai para" deve ser usada.


Mas por que "vai para"?

Porque "preenche o quadro de pilha do código a seguir" é muito longo para continuar dizendo isso. Suponho que você poderia dizer "é / é passado para".

Uma diferença crucial entre parâmetros explicitamente passados ​​e variáveis ​​capturadas (se bem me lembro - me corrija se estiver errado) é que os primeiros são passados ​​por referência e os últimos por valor.

Peter Wone
fonte
1
Não vejo exatamente como sua conclusão se segue da sua discussão. Por outro lado, acho que caracterizar => em termos de como os fechamentos podem (ou não) ser implementados não é uma boa maneira de lidar com a pergunta que é feita.
precisa
O primeiro parágrafo é enganoso. Expressões lambda são construções de primeira classe. A função embutir é uma otimização. O último parágrafo é ainda mais. As variáveis ​​associadas em expressões lambda (o que você chama de "variáveis ​​capturadas") não são passadas para lugar algum. Eles são embalados e adicionados como parte do objeto lambda. Se eles foram aprovados, você teria que nomeá-los novamente - para mencionar uma diferença.
Neowizard 23/11
1

Parte do problema é que você pode lê-lo em voz alta de maneira diferente, dependendo de como está estruturado. É uma pena que não seja tão bonito ou tão integrado quanto o do ruby.

Tad Donaghe
fonte
Como se diz |? O mesmo que o cachimbo?
DTC
Difícil encontrar algum guia sobre isso, mas _por que usa "take each", ou seja, People.each {| person | coloca person.name} se torna "Com as pessoas pegam cada pessoa e imprimem o nome"
Adam Lassek
1

Em Ruby, esse mesmo sybmol é chamado "hashrocket" e ouvi programadores de C # usarem esse termo também (mesmo que isso esteja errado).

Pharylon
fonte
0

Meus dois centavos:

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

"Expressão Lambda com o parâmetro s é { return s.Age > 12 && s.Age < 20;}"

Eu gosto disso porque me lembra de onde vem a expressão lamdba

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

=> é apenas um atalho para que você não precise usar a palavra-chave delegada e incluir as informações de tipo, pois elas podem ser inferidas pelo compilador.

Allan
fonte
0

Meu termo para => conforme aplicado aos exemplos mostrados resulta

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

s onde s.A idade é maior que 12 e s.A idade é menor que 20

'result = x => x * 2'

x onde x é multiplicado por 2

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

c onde c.city é equivalente a "London"

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

n onde n é uma string vazia

Arthur
fonte