Eu vejo muita conversa aqui sobre linguagens funcionais e outras coisas. Por que você usaria uma sobre uma linguagem "tradicional"? O que eles fazem melhor? No que eles são piores? Qual é o aplicativo de programação funcional ideal?
programming-languages
functional-programming
MattBelanger
fonte
fonte
Respostas:
Linguagens funcionais usam um paradigma diferente das linguagens imperativas e orientadas a objetos. Eles usam funções livres de efeitos colaterais como um componente básico no idioma. Isso permite muitas coisas e torna muitas coisas mais difíceis (ou na maioria dos casos diferentes do que as pessoas estão acostumadas).
Uma das maiores vantagens da programação funcional é que a ordem de execução das funções sem efeitos colaterais não é importante. Por exemplo, em Erlang, isso é usado para habilitar a simultaneidade de uma maneira muito transparente. E como as funções em linguagens funcionais se comportam de maneira muito semelhante às funções matemáticas, é fácil traduzi-las para linguagens funcionais. Em alguns casos, isso pode tornar o código mais legível.
Tradicionalmente, uma das grandes desvantagens da programação funcional também era a falta de efeitos colaterais. É muito difícil escrever software útil sem E / S, mas é difícil implementá-lo sem efeitos colaterais nas funções. Portanto, a maioria das pessoas nunca tirou mais proveito da programação funcional do que calcular uma única saída a partir de uma única entrada. Nas linguagens modernas de paradigma misto, como F # ou Scala, isso é mais fácil.
Muitas linguagens modernas possuem elementos de linguagens de programação funcionais. O C # 3.0 possui muitos recursos de programação funcional e você também pode fazer programação funcional em Python. Penso que os motivos da popularidade da programação funcional se devem principalmente a dois motivos: a simultaneidade está se tornando um problema real na programação normal, porque estamos adquirindo cada vez mais computadores multiprocessadores; e os idiomas estão ficando mais acessíveis.
fonte
Eu não acho que exista alguma dúvida sobre a abordagem funcional da programação "porque está em uso", porque ela está em uso (como um estilo de programação) há cerca de 40 anos. Sempre que um programador de OO escreve código limpo que favorece objetos imutáveis, esse código empresta conceitos funcionais.
No entanto, os idiomas que impõem um estilo funcional estão recebendo muita tinta virtual hoje em dia, e se esses idiomas se tornarão dominantes no futuro é uma questão em aberto. Minha própria suspeita é que linguagens híbridas de múltiplos paradigmas, como Scala ou OCaml , provavelmente dominem sobre linguagens funcionais "puristas" da mesma maneira que a linguagem OO pura (Smalltalk, Beta etc.) influenciou a programação convencional, mas ainda não terminou como as notações mais usadas.
Por fim, não consigo resistir ao apontar que seus comentários sobre FP são altamente paralelos às observações que ouvi de programadores de procedimentos há não muitos anos atrás:
Assim como interfaces gráficas de usuário e "código como modelo de negócios" foram conceitos que ajudaram o OO a ser mais amplamente apreciado, acredito que o aumento do uso da imutabilidade e o paralelismo mais simples (maciço) ajudarão mais programadores a ver os benefícios que a abordagem funcional oferece . Mas, tanto quanto aprendemos nos últimos 50 anos que compõem toda a história da programação de computadores digitais, acho que ainda temos muito a aprender. Daqui a 20 anos, os programadores olharão surpresos para a natureza primitiva das ferramentas que estamos usando atualmente, incluindo as agora populares OO e FP.
fonte
A principal vantagem para mim é o paralelismo inerente, especialmente porque agora estamos nos afastando de mais MHz e em direção a mais e mais núcleos.
Eu não acho que ele se tornará o próximo paradigma de programação e substituirá completamente os métodos do tipo OO, mas acho que chegaremos ao ponto em que precisamos escrever parte do nosso código em uma linguagem funcional ou nossas linguagens de uso geral crescer para incluir construções mais funcionais.
fonte
Mesmo que você nunca trabalhe profissionalmente em uma linguagem funcional, entender a programação funcional fará de você um desenvolvedor melhor. Isso lhe dará uma nova perspectiva sobre seu código e programação em geral.
Eu digo que não há razão para não aprender.
Eu acho que as linguagens que fazem um bom trabalho ao misturar estilo funcional e imperativo são as mais interessantes e com maior probabilidade de sucesso.
fonte
Eu sou sempre cético sobre a próxima grande coisa. Muitas vezes o Next Big Thing é puro acidente da história, estando lá no lugar certo, no momento certo, independentemente de a tecnologia ser boa ou não. Exemplos: C ++, Tcl / Tk, Perl. Todas as tecnologias defeituosas, todas muito bem-sucedidas, porque foram percebidas como para resolver os problemas do dia ou para serem quase idênticas aos padrões estabelecidos, ou a ambos. A programação funcional pode realmente ser ótima, mas isso não significa que será adotada.
Mas posso dizer por que as pessoas estão empolgadas com a programação funcional: muitos programadores tiveram uma espécie de "experiência de conversão" na qual descobrem que usar uma linguagem funcional as torna duas vezes mais produtivas (ou talvez dez vezes mais produtivas) enquanto produzem código mais resistente a alterações e com menos bugs. Essas pessoas pensam na programação funcional como uma arma secreta; Um bom exemplo dessa mentalidade é Beating the Averages, de Paul Graham . Ah, e sua aplicação? Aplicativos da web de comércio eletrônico.
Desde o início de 2006, também houve alguns rumores sobre programação funcional e paralelismo. Como pessoas como Simon Peyton Jones preocupam-se com o paralelismo desde 1984, pelo menos, não prendo a respiração até que as linguagens funcionais resolvam o problema multicore. Mas isso explica alguns dos burburinhos adicionais agora.
Em geral, as universidades americanas estão fazendo um mau trabalho no ensino de programação funcional. Há um forte núcleo de suporte para o ensino de programação de introdução usando o Scheme , e Haskell também conta com algum suporte, mas há muito pouco no ensino de técnicas avançadas para programadores funcionais. Eu ministrei esse curso em Harvard e o farei novamente nesta primavera na Tufts. Benjamin Pierce ministrou esse curso na Penn. Não sei se Paul Hudak fez alguma coisa em Yale. As universidades europeias estão fazendo um trabalho muito melhor; por exemplo, a programação funcional é enfatizada em locais importantes na Dinamarca, Holanda, Suécia e Reino Unido. Eu tenho menos noção do que está acontecendo na Australásia.
fonte
Não vejo ninguém mencionando o elefante na sala aqui, então acho que depende de mim :)
JavaScript é uma linguagem funcional. À medida que mais e mais pessoas fazem coisas mais avançadas com o JS, especialmente aproveitando os pontos mais refinados do jQuery, Dojo e outras estruturas, o FP será introduzido pela porta traseira do desenvolvedor da web.
Em conjunto com os fechamentos, o FP torna o código JS realmente leve, mas ainda legível.
Saúde, PS
fonte
As maneiras de OO nem sempre foram "normais". O padrão desta década foi o conceito marginalizado da última década.
Programação funcional é matemática. Paul Graham no Lisp (substitua a programação funcional pelo Lisp):
fonte
Aposto que você não sabia que era programação funcional quando usou:
fonte
Essa é apenas uma questão de tempo. Seu programador corporativo médio aprende qualquer que seja a grande coisa atual. Há 15 anos, eles não entendiam POO. Se o FP persistir, seus "programadores corporativos médios" seguirão.
Varia muito. Na minha universidade, o SML é a primeira língua para a qual os alunos são apresentados. Eu acredito que o MIT ensina o LISP como um curso do primeiro ano. Esses dois exemplos podem não ser representativos, é claro, mas acredito que a maioria das universidades, no mínimo, oferece alguns cursos opcionais sobre FP, mesmo que não o tornem uma parte obrigatória do currículo.
Não é realmente uma questão de "simples o suficiente". Uma solução seria mais simples (ou mais legível, robusta, elegante, com desempenho) no FP? Muitas coisas são "simples o suficiente para serem resolvidas em Java", mas ainda exigem uma quantidade enorme de código.
De qualquer forma, lembre-se de que os defensores da PF alegaram que era a Próxima Grande Coisa há várias décadas. Talvez eles estejam certos, mas lembre-se de que não estavam quando fizeram a mesma reivindicação há 5, 10 ou 15 anos.
Uma coisa que definitivamente conta a seu favor, porém, é que, recentemente, o C # deu uma guinada acentuada em relação ao FP, na medida em que praticamente transforma uma geração de programadores em programadores de FP, sem que eles percebam . Isso pode apenas abrir o caminho para a "revolução" do FP. Talvez. ;)
fonte
O homem não pode entender a perfeição e as imperfeições de sua arte escolhida se não puder ver o valor em outras artes. Seguir as regras apenas permite o desenvolvimento até um ponto na técnica e, em seguida, o aluno e o artista precisam aprender mais e procurar mais. Faz sentido estudar outras artes, bem como as de estratégia.
Quem não aprendeu algo mais sobre si mesmo observando as atividades dos outros? Para aprender a espada, estude o violão. Para aprender o primeiro estudo sobre comércio. Apenas estudar a espada fará com que você tenha uma mente estreita e não permita que você cresça para fora.
- Miyamoto Musashi, "Um Livro dos Cinco Anéis"
fonte
Um recurso importante em uma linguagem funcional é o conceito de funções de primeira classe. A idéia é que você pode passar funções como parâmetros para outras funções e retorná-las como valores.
A programação funcional envolve escrever código que não muda de estado. A principal razão para fazer isso é que chamadas sucessivas para uma função produzam o mesmo resultado. Você pode escrever código funcional em qualquer idioma que suporte funções de primeira classe, mas existem alguns idiomas, como Haskell, que não permitem alterar o estado. Na verdade, você não deve causar nenhum efeito colateral (como imprimir texto) - o que parece ser completamente inútil.
Haskell emprega uma abordagem diferente para IO: mônadas. Esses são objetos que contêm a operação de E / S desejada a ser executada pelo nível superior do intérprete. Em qualquer outro nível, eles são simplesmente objetos no sistema.
Quais vantagens a programação funcional oferece? A programação funcional permite a codificação com menos potenciais para erros, porque cada componente é completamente isolado. Além disso, o uso de funções de recursão e de primeira classe permite provas simples de correção, que normalmente refletem a estrutura do código.
fonte
Eu não acho que a maioria das pessoas realistas ache que a programação funcional vai pegar (se torna o principal paradigma como o OO). Afinal, a maioria dos problemas de negócios não são problemas matemáticos, mas regras imperativas e peludas para mover dados e exibi-los de várias maneiras, o que significa que não é uma boa opção para o paradigma de programação funcional pura (a curva de aprendizado da mônada excede em muito o OO).
OTOH, programação funcional é o que torna a programação divertida. Faz você apreciar a beleza inerente e atemporal de expressões sucintas da matemática subjacente do universo. As pessoas dizem que aprender programação funcional o tornará um programador melhor. É claro que isso é altamente subjetivo. Pessoalmente, também não acho que isso seja verdade.
Faz de você um ser mais consciente.
fonte
Eu devo ser densa, mas ainda não entendo. Existem exemplos reais de aplicativos pequenos escritos em uma linguagem funcional como F #, na qual você pode ver o código-fonte e ver como e por que era melhor usar essa abordagem do que, digamos, C #?
fonte
Eu apontaria que tudo o que você disse sobre linguagens funcionais, a maioria das pessoas estava dizendo sobre idiomas orientados a objetos há cerca de 20 anos. Naquela época, era muito comum ouvir sobre OO:
A mudança tem que vir de algum lugar. Uma mudança significativa e importante acontecerá independentemente de as pessoas treinadas em tecnologias anteriores terem a opinião de que a mudança não é necessária. Você acha que a mudança para OO foi boa, apesar de todas as pessoas que eram contra na época?
fonte
O F # pode pegar porque a Microsoft está pressionando.
Pró:
Contra:
Então, dou 50:50 de chance ao F # se tornar importante. Outras linguagens funcionais não chegarão ao futuro próximo.
fonte
Penso que um dos motivos é que algumas pessoas acham que a parte mais importante da aceitação de um idioma é a qualidade do idioma . Infelizmente, as coisas raramente são tão simples. Por exemplo, eu argumentaria que o maior fator por trás da aceitação do Python não é a própria linguagem (embora isso seja muito importante). A maior razão pela qual o Python é tão popular é sua enorme biblioteca padrão e a comunidade ainda maior de bibliotecas de terceiros.
Idiomas como Clojure ou F # podem ser uma exceção à regra, considerando que eles são criados na JVM / CLR. Como resultado, não tenho uma resposta para eles.
fonte
A maioria das aplicações pode ser resolvida em [insira seu idioma, paradigma favorito etc. etc.].
Embora isso seja verdade, diferentes ferramentas podem ser usadas para resolver problemas diferentes. O funcional apenas permite outra abstração de alto nível (mais alto?) Que permite realizar nossos trabalhos com mais eficiência quando usada corretamente.
fonte
Parece-me que as pessoas que nunca aprenderam Lisp ou Scheme na graduação agora estão descobrindo isso. Tal como acontece com muitas coisas neste campo, existe uma tendência a exagerar e criar grandes expectativas ...
Vai passar.
A programação funcional é ótima. No entanto, não dominará o mundo. C, C ++, Java, C #, etc ainda estarão por aí.
Acho que o que resultará disso é mais capacidade entre idiomas - por exemplo, implementar coisas em uma linguagem funcional e, em seguida, dar acesso a essas coisas em outras línguas.
fonte
Ao ler "A próxima linguagem de programação convencional: a perspectiva de um desenvolvedor de jogos", de Tim Sweeney, Epic Games, meu primeiro pensamento foi - eu aprendi Haskell.
PPT
Versão HTML do Google
fonte
As coisas estão se movendo em uma direção funcional por um tempo. Os dois novos garotos legais dos últimos anos, Ruby e Python, são radicalmente mais próximos das linguagens funcionais do que o que veio antes deles - tanto que alguns Lispers começaram a suportar um ou outro como "próximos o suficiente".
E com o hardware massivamente paralelo colocando pressão evolucionária sobre todos - e as linguagens funcionais no melhor lugar para lidar com as mudanças - não é tão longe quanto era antes pensar que Haskell ou F # serão a próxima grande novidade.
fonte
Você tem acompanhado a evolução das linguagens de programação ultimamente? Cada nova versão de todas as linguagens de programação convencionais parece emprestar cada vez mais recursos da programação funcional.
Fechamentos, funções anônimas, funções de passagem e retorno como valores costumavam ser características exóticas conhecidas apenas pelos hackers Lisp e ML. Porém, gradualmente, C #, Delphi, Python, Perl, Javascript adicionaram suporte a fechamentos. Não é possível que qualquer linguagem promissora seja levada a sério sem fechamento.
Várias linguagens, principalmente Python, C # e Ruby, têm suporte nativo para compreensão de listas e geradores de lista.
A ML foi pioneira na programação genérica em 1973, mas o suporte a genéricos ("polimorfismo paramétrico") só se tornou um padrão da indústria nos últimos cinco anos. Se bem me lembro, o Fortran deu suporte a genéricos em 2003, seguido pelo Java 2004, C # em 2005 e Delphi em 2008. (Eu sei que o C ++ suporta modelos desde 1979, mas 90% das discussões sobre o STL do C ++ começam com "aqui existem demônios" .)
O que torna esses recursos atraentes para os programadores? Deve ser claramente óbvio: ajuda os programadores a escrever um código mais curto . Todos os idiomas no futuro apoiarão, no mínimo, o fechamento, se quiserem permanecer competitivos. A esse respeito, a programação funcional já está no mainstream.
Quem disse que também não pode usar programação funcional para coisas simples? Nem todo programa funcional precisa ser um compilador, provador de teoremas ou comutador de telecomunicações massivamente paralelo. Uso regularmente o F # para scripts descartáveis ad hoc, além dos meus projetos mais complicados.
fonte
Ele está pegando porque é a melhor ferramenta para controlar a complexidade. Veja:
- slides 109-116 da palestra de Simon Peyton-Jones "Um gosto de Haskell"
- "A próxima linguagem de programação convencional: a perspectiva de um desenvolvedor de jogos", de Tim Sweeney
fonte
Caixa Por que a programação funcional é importante
fonte
Eu concordo com o primeiro ponto, mas os tempos mudam. As empresas responderão, mesmo que sejam adotantes tardias, se perceberem que há uma vantagem a ser obtida. A vida é dinâmica.
Eles estavam ensinando Haskell e ML em Stanford no final dos anos 90. Tenho certeza de que lugares como Carnegie Mellon, MIT, Stanford e outras boas escolas estão apresentando isso aos alunos.
Concordo que a maioria dos aplicativos "exponha bancos de dados relacionais na Web" continuará nesse sentido por muito tempo. Java EE, .NET, RoR e PHP desenvolveram algumas soluções muito boas para esse problema.
Você alcançou algo importante: pode ser o problema que não pode ser resolvido facilmente por outros meios que aumentem a programação funcional. O que seria aquilo?
O hardware multicore maciço e a computação em nuvem os impulsionarão?
fonte
Porque o FP tem benefícios significativos em termos de produtividade, confiabilidade e manutenção. Muitos núcleos podem ser um aplicativo matador que finalmente faz com que as grandes empresas mudem, apesar de grandes volumes de código herdado. não se encaixam bem com concorrência e paralelismo.
Não concordo que programadores "normais" não o entendam. Eles entenderão, assim como acabaram entendendo OOP (que é igualmente misterioso e estranho, se não mais).
Além disso, a maioria das universidades ensina FP, muitas até ensinam como o primeiro curso de programação.
fonte
Uau - esta é uma discussão interessante. Meus próprios pensamentos sobre isso:
O FP torna algumas tarefas relativamente simples (em comparação com idiomas não FP). As linguagens sem FP já estão começando a receber idéias do FP, então eu suspeito que essa tendência continuará e veremos mais uma fusão que deve ajudar as pessoas a facilitar o salto para o FP.
fonte
Eu não sei se ele vai pegar ou não, mas pelas minhas investigações, uma linguagem funcional quase certamente vale a pena aprender, e fará de você um programador melhor. Apenas o entendimento da transparência referencial facilita muito as decisões de design - e os programas resultantes são muito mais fáceis de raciocinar. Basicamente, se você encontrar um problema, ele tende a ser apenas um problema com a saída de uma única função, em vez de um problema com um estado inconsistente, que poderia ter sido causado por qualquer uma das centenas de classes / métodos / funções em uma linguagem imparcial com efeitos colaterais.
A natureza apátrida do FP mapeia de maneira mais natural à natureza apátrida da web e, portanto, as linguagens funcionais se prestam mais facilmente a aplicativos da web RESTFUL mais elegantes. Contraste com as estruturas JAVA e .NET que precisam recorrer a HACKS horrivelmente feios, como as teclas VIEWSTATE e SESSION, para manter o estado do aplicativo e manter a abstração (ocasionalmente bastante vazada) de uma linguagem imperativa com estado, em uma plataforma funcional essencialmente sem estado como a Web.
E também, quanto mais apátrida for sua aplicação, mais facilmente ela poderá ser processada em paralelo. Muito importante para a web, se o seu site ficar popular. Nem sempre é fácil adicionar mais hardware a um site para obter melhor desempenho.
fonte
Meu ponto de vista é que ele continuará assim que a Microsoft forçou muito mais o mainstream. Para mim, é atraente pelo que pode fazer por nós, porque é um novo desafio e pelas oportunidades de emprego em que se ressente para o futuro.
Uma vez dominada, será outra ferramenta para ajudar a tornar-nos mais produtivos como programadores.
fonte
Um ponto esquecido na discussão é que os melhores sistemas de tipos são encontrados nas linguagens FP contemporâneas. Além disso, os compiladores podem inferir todos (ou pelo menos a maioria) dos tipos automaticamente.
É interessante que você gaste metade do tempo escrevendo nomes de tipos ao programar Java, mas Java não é de longe um tipo seguro. Embora você nunca possa escrever tipos em um programa Haskell (exceto como um tipo de documentação verificada pelo compilador) e o código é 100% seguro.
fonte
Além das outras respostas, lançar a solução em termos funcionais puros obriga a entender melhor o problema. Por outro lado, pensar em um estilo funcional desenvolverá melhores habilidades de resolução de problemas.
* Ou porque o paradigma funcional é melhor ou porque oferece um ângulo de ataque adicional.
fonte