Eu estava com dificuldades para encontrar um exemplo da vida real do uso da função curry e obter o benefício de usar o curry.
Quando eu google função curry, muitas vezes vejo o exemplo como
let add = x => y => x + y;
let add10 = add(10);
console.log(add10(20));
Devo dizer que realmente não vejo o valor de usar curry neste exemplo.
Depois de ler as respostas neste SO /programming/113780/javascript-curry-what-are-the-practical-applications , ainda não vejo o benefício de usá-lo.
Por exemplo, a resposta com a pontuação mais alta fornece um exemplo de conversor, mas esse exemplo pode ser reescrito sem curry, como mostra outra resposta.
Eu também li as respostas Qual é a vantagem de currying? (embora a discussão não se limite ao javascript), ainda sinto que a versão curry pode ser reescrita sem curry (em js).
Então, alguém pode me mostrar a vantagem / benefício "real" do uso de curry em javascript?
---- atualização ----
Exceto pelas respostas que recebi, também acho que o exemplo de log mostra o benefício de usá-lo.
for
loop pode ser reescrito como umwhile
loop. Cadaif
declaração pode ser reescrita como umwhile
loop. Cadawhile
loop pode ser reescrito como umgoto
. Isso não significa que eles não são úteis.Respostas:
Eu quase nunca usei o Currying, mas aqui está um exemplo recente em que isso se mostrou útil. Eu estava codificando para o jogo Battlesnake , mas isso se aplica a muitos jogos. Eles fornecem várias matrizes, fornecendo a localização de sua cobra, cobras inimigas e comida. Digamos que você esteja considerando mudar para um determinado ponto {x, y} e deseje verificar se ele contém outra cobra, comida ou até você. A primeira passagem seria escrever um código como este (usarei uma mistura de funções e novas setas com fangled)
e em algum lugar no código ir
Não é ruim, mas, como você fará isso em muitos lugares do seu código, um pouco entediante e desajeitado. E, pela minha experiência, é fácil atrapalhar os dois argumentos. :-( O problema subjacente é que
some()
(oufind()
) aceita uma função usando apenas um único argumento, e você realmente precisa de dois argumentos , os dois pontos. Então, você pensa em currying! Aqui muitos usariam setas, acho as funções aninhadas mais claras:Então, seu teste "é essa comida" se torna
Isso vai fazer de você um milionário da Internet? Provavelmente não. Mas isso simplifica e, nesse caso, esclarece seu código.
fonte
Curry no seu exemplo realmente não faz sentido, eu concordo. Para ver a funcionalidade do curry, é necessário combiná-lo com funções de ordem superior: funções que assumem outras funções como parâmetro.
O exemplo mais típico disso é mapear, filtrar e reduzir, embora outra situação comum seja retornos de chamada. Ao aplicar parcialmente uma função, você pode passar a função parcialmente aplicada a essas funções de ordem superior. O curry faz sentido quando na maioria das vezes você deseja usar uma função é para um aplicativo parcial, para que possa ser passado para outra função de ordem superior.
Um exemplo mais ilustrativo pode parecer assim:
O curry nunca é necessário, sim, pois você sempre pode criar uma função anônima / flecha a partir de uma função regular quando precisar, mas em algumas situações pode ser muito conveniente ter a função curry comparada à regular (e em outras situações, é apenas tornando as coisas chatas e lentas).
fonte
{}
, não achei as classes Builder muito úteis ou comuns. Você pode citar alguns exemplos?Object.assign()
é muito fácil ramificar-se de uma configuração básica.