"A OLP não poderá mais nos salvar dos Monstros da Nuvem."
Nota do tradutor: existem dois conceitos - paralelismo (execução simultânea, independente) e competitividade (execução passo a passo, por sua vez, mas ao mesmo tempo várias tarefas) e, como sempre, tive que esmagar minha cabeça escolhendo os termos certos.
Duplicarei algumas palavras ou termos entre parênteses no original, a fim de procurar informações adicionais em termos em inglês, que serão muitas vezes mais.Talvez você já tenha ouvido essa expressão, como: "Clojure", "Scala", "Erlang" ou mesmo "Java agora tem lambdas". E você tem, embora uma idéia distante de "Programação Funcional". Se você é membro de qualquer tipo de comunidade de programação, esse tópico já poderá ser discutido por você.Se você pesquisar no Google a frase "Programação funcional", não verá nada de novo. O segundo idioma dos criados anteriormente já aborda esse tópico, criado nos anos 50 e denominado Lisp. Então, que diabos, esse tópico se tornou popular agora? Apenas 60 anos depois?No começo, os computadores eram muito lentos
Acredite ou não, os computadores eram os mais lentos que o DOM. Não mesmo. E, ao mesmo tempo, havia duas idéias principais no acordo sobre o design e a implementação de linguagens de programação:Os computadores não tinham poder computacional suficiente para lidar com todas as abstrações e lidar com programas escritos em um estilo funcional. Portanto, Lisp estava exausto antes, sendo extremamente lento e, portanto, inadequado para o trabalho. Foi então que o domínio do estilo imperativo de programação começou, especialmente no auge de C.Mas os computadores melhoraram muito.
Agora, tornou-se quase normal o uso da maioria dos aplicativos, sem se importar com o idioma em que foram escritos. As linguagens funcionais finalmente tiveram uma segunda chance.Programação funcional 50.5
Este artigo não é de forma alguma uma introdução ao FI. No final desta seção, você precisará saber o que é a FA e como iniciar sua jornada de estudo.Você pode entender o termo “Programação Funcional” literalmente como programação usando funções e isso não está longe da verdade. Você criará funções em termos de outras funções e funções de escrita (Você se lembra de f ^ g do currículo da escola? Agora isso será útil). É tudo.A lista (não completa) de recursos do FP:- Funções de primeira classe
- Funções de alta ordem
- Funções puras
- Encerramentos
- Estado imutável
Agora você não precisa se preocupar com esses termos estranhos, apenas entenda o que eles significam.Funções da primeira classe significa que você pode salvar funções em variáveis. Tenho certeza de que você fez algo semelhante, como no exemplo do JavaScript:var add = function(a, b){
return a + b
}
Você acabou de criar uma função anônima que recebe um e b e retorna a + b , e atribui essa função para o add variável .Funções de ordem superior significa que as funções podem retornar funções ou aceitar funções como parâmetros.E novamente em JavaScript:document.querySelector('#button')
.addEventListener('click', function(){
alert('yay, i got clicked')
})
ouvar add = function(a){
return function(b){
return a + b
}
}
var add2 = add(2)
add2(3)
Ambas as opções são um exemplo de funções de ordem superior, mesmo que você não tenha escrito algo assim, talvez tenha visto algo semelhante em outro lugar.Funções puras significa que a função não altera as variáveis, simplesmente aceita os dados e retorna os dados, como nossas funções favoritas da matemática. Isso também significa que, se você chamar a função f com o argumento 2 e retornar 10 , sempre retornará 10 . Não importa qual ambiente, número de threads ou ordem de execução. Eles não causam efeitos colaterais em outras partes do programa e esse é um conceito realmente poderoso.Curto circuitos significa que você pode salvar alguns dados dentro da função que estarão disponíveis em uma função de retorno específica; em outras palavras, a função de retorno armazena seu tempo de execução.var add = function(a){
return function(b){
return a + b
}
}
var add2 = add(2)
add2(3)
Veja novamente o segundo exemplo do parágrafo Funções de ordem superior , a variável a foi fechada e está disponível apenas na função retornada. De fato, o fechamento não é uma característica do paradigma de PF, mas de otimização.Um estado imutável significa que você não pode alterar nenhum estado (embora possa criar novos). No código a seguir (no OCaml), você define a variável x como 5 e x sempre será 5 .let x = 5;;
x = 6;;
print_int x;;
Esses recursos parecem bastante estranhos, mas você verá em breve como eles facilitam sua vida.A programação orientada a objetos não pode mais protegê-lo
Este é um momento promissor em que finalmente podemos ter aplicativos distribuídos e multiencadeados. Infelizmente, nosso modelo existente (ou mais usado) não está pronto para multithreading (simultaneidade) e paralelismo, embora resolva os problemas atuais, mas também adicione grandes problemas.Para melhorar os aplicativos, precisamos de uma maneira simples e confiável para alcançar o que queremos. Você se lembra dos recursos acima mencionados do AF? Funções puras e estado imutável? É isso mesmo, você pode executar funções milhares de vezes em núcleos ou máquinas diferentes e o resultado será sempre o mesmo. E assim, podemos executar o mesmo código no mesmo núcleo e em milhares. A vida novamente se torna sem nuvens."Mas por que não posso continuar usando o OOP?"
Pelo menos para multithreading e paralelismo, o OOP não pode mais ajudá-lo. Porque OOP refere-se a um estado com um estado mutável (em linguagens imperativas que são escritas no estilo OOP, na maioria dos casos). Os métodos chamados do objeto devem alterar o eu atual ou isso . Você precisará fazer um esforço suficiente para atualizar e sincronizar corretamente todos os threads.Estou escrevendo isso para não agitar você a mudar para o FP a partir dos paradigmas que você está usando atualmente (embora algumas pessoas digam que eu deva), mas você definitivamente deve entender: Java e C ++ 11 já têm cálculo lambda. Posso dizer que quase todas as linguagens modernas e suportadas implementam recursos de FP ou já o fizeram.Note-se que não devemos parar de usar o estado mutável. Devemos usar entrada / saída (IO), etc., para que nossos programas sejam úteis. A idéia principal do FP é: use um estado mutável apenas quando for realmente necessário."Eu não trabalho com nuvens, preciso mesmo estudar FA?"
Sim.A Programação Funcional ajudará você a escrever melhor os programas e falar sobre os problemas que você precisa resolver."Eu tentei. É muito complicado e difícil de ler o código. ”
Começar é sempre difícil em qualquer campo. Tenho certeza que você começou a aprender programação também tendo muitos problemas, mesmo nas linguagens OOP. Talvez começar a escrever no estilo OOP fosse mais fácil do que escrever o seu primeiro programa, porque você já estava familiarizado com alguns idiomas comuns, como declarar variáveis e loops for / while.Começar a aprender FP é quase o mesmo que começar a escrever programas do zero novamente (não importa qual idioma você começou a aprender, será inequívoco como começar desde o início).Muitos podem notar que a AF é difícil de ler. Se você possui experiência em linguagens imperativas, os programas funcionais serão parecidos com criptografia. E não porque realmente é, mas porque você não conhece seus principais idiomas. Uma vez entendidos os princípios fundamentais, os programas se tornarão muito mais legíveis.Confira o programa escrito em Haskell e JavaScript (estilo imperativo):guess :: Int -> [Char]
guess 7 = "Much 7 very wow."
guess x = "Ooops, try again."
function guess(x){
if(x == 7){
return "Much 7 very wow."
}
else {
return "Oops, try again."
}
}
Esse é um programa muito simples. Ele exibe uma mensagem de felicitações quando o usuário adivinhou e digitou o número 7 ou exibe uma mensagem de erro em todos os outros casos. Talvez isso pareça criptografia, pois Haskell pode fazer todo o trabalho em apenas duas linhas de código (você pode ignorar a primeira linha, é apenas uma "declaração de tipo"). Mas isso se tornará bastante simples, uma vez que tenhamos entendido as possibilidades de correspondência de padrões (que são implementadas não apenas nas linguagens FP, mas eram sua característica).O que Haskell faz:Se o argumento aceito para adivinhar for 7, ele retornará "Muito 7 muito uau". ou retornará "Oooops, tente novamente". Em outros casos.E é a mesma coisa que o código JavaScript faz, mas Haskell mapeia para o "padrão" declarado pelo programador no código.Essa abordagem pode não parecer muito útil nesse caso, se você puder usar if / else. Mas isso será realmente útil quando você começar a escrever estruturas de dados mais complexas.plus1 :: [Int] -> [Int]
plus1 [] = []
plus1 (x:xs) = x + 1 : plus1 xs
No programa acima, * plus1 * é uma função que pega uma lista de números inteiros e adiciona 1 a cada elemento da lista. A função compara quando a lista está vazia [] (retorna outra lista vazia, pois não há elementos nela) ignora a lista não vazia e determina o padrão de correspondência: x como o primeiro elemento da lista, xs como a lista restante. Depois, simplesmente calcula a soma e combina através de uma chamada recursiva.Tenho certeza de que você gastará muitos minutos (não o mais agradável), reescrevendo este exemplo em um estilo imperativo, ajustando o código em duas linhas, mantendo a legibilidade.Então vamos começar
Muito material sobre Programação Funcional foi publicado, mas você não deve pular esses links sem ambiguidade:- Princípios de programação funcional no Scala : o curso será útil para quem conhece Java e deseja experimentar a programação funcional sem sair da JVM. O curso aborda conceitos básicos.
- Paradigmas de programação de computadores - Fundamentos : este curso será útil para quem deseja aprender a escrever programas em uma linguagem funcional. O curso usa a linguagem de aprendizagem Qz. Existem muitos exercícios no curso, você pode usar uma linguagem funcional e tentar criar sua própria estrutura de dados. Acredito que o curso forneça blocos de construção para o "edifício" chamado "Programação Funcional", ele o ajudará com outros idiomas no futuro.
Infelizmente, os cursos estarão disponíveis apenas no final do ano. Mas você pode acompanhar o conteúdo e os vídeos, eles estão disponíveis no Youtube.Por outro lado, se você preferir materiais de texto, certamente recomendo alguns deles:- Estrutura e Interpretação de Programas de Computador
- Como criar programas
- Conceitos, técnicas e modelos de programação de computadores
Os dois primeiros têm currículos semelhantes, apresentam as bases da programação funcional e são muito adequados para iniciantes. O terceiro dos links, este curso de Paradigmas de Programação de Computadores, abrange mais do que Programação Funcional. É importante observar que esses materiais são para iniciantes.Além disso, Chris Allen escreveu um excelente artigo sobre o estudo da Programação Funcional. É chamado de Educação Funcional.e possui uma lista exaustiva de materiais para estudar a programação funcional usando Haskell, além de falar sobre os pontos fortes e fracos dessa abordagem. Seguindo os links recomendados por Chris, você pode aprender os princípios básicos e os tópicos mais complexos (tenho certeza de que ouviu falar de mônadas) da Programação Funcional e talvez você entenda como escrever aplicativos usando-os. (Obrigado, Chris, pelos links para os materiais.)Boa sorte com o seu ano novo funcional! ☺