Programação funcional em ascensão?

42

Ultimamente, tenho notado que linguagens de programação funcional estão ganhando popularidade . Vi recentemente como o Índice Tiobe mostra um aumento em sua popularidade em comparação com o ano passado, embora a maioria nem chegue aos 50 idiomas mais populares de acordo com esse índice.

E esse tem sido o caso há algum tempo. A programação funcional simplesmente não se tornou tão popular quanto outros modelos (isto é, programação orientada a objetos).

Entretanto, vi um interesse renascido no poder da programação funcional e agora que os multicores são cada vez mais populares, os desenvolvedores começaram a mostrar interesse em outros modelos de concorrência já explorados no passado por linguagens como Haskell e Erlang.

Vejo com grande interesse o fato de que, apesar da falta de aceitação significativa da comunidade, mais e mais idiomas desse tipo continuam surgindo. Clojure (2007), Scala (2003), F # (2002) são apenas três exemplos da década passada.

Eu próprio investi algum tempo aprendendo Haskell e Scala. E encontro um grande potencial no paradigma que, para mim, era novo, apesar de estar lá por tanto tempo.

E, claro, minha maior pergunta é se alguma dessas coisas se tornará popular o suficiente para considerar colocar algum esforço nelas, mas essa é uma pergunta que nem Mandrake poderia responder, apesar de todo o barulho que as pessoas estão fazendo sobre elas.

O que eu quero perguntar é:

  • Em quais cenários devo considerar uma linguagem de programação funcional mais adequada para executar uma determinada tarefa? Além do tão recentemente popular problema multicore da programação paralela.
  • Se eu decidisse mudar para uma linguagem de programação funcional que você consideraria as maiores armadilhas que eu enfrentaria? (Além da mudança de paradigma e da dificuldade de avaliar o desempenho devido à avaliação preguiçosa).
  • Com tantas linguagens de programação funcionais por aí, como você escolheria a que melhor se adequa às suas necessidades?

Quaisquer recomendações para futuras pesquisas serão mais que bem-vindas.

Pesquisei opiniões na Web e parece que toda essa popularidade renovada vem da idéia de que agora estamos prestes a atingir a lei de Moore e as linguagens de programação funcionais virão e nos salvarão heroicamente. Mas, se esse for o caso, eu diria que há mais probabilidades de as linguagens populares existentes se adaptarem ao paradigma.

Alguns de vocês, com mais experiência trabalhando todos os dias com esses idiomas, talvez possam oferecer mais informações sobre o assunto. Todas as suas opiniões serão melhor apreciadas e cuidadosamente consideradas.

Desde já, obrigado!

edalorzo
fonte
4
É Erlang, não Earlang (eu teria editado sua postagem, mas o Sistema não permite edições de uma letra).
Quant_dev 26/04/11
6
Vale a pena dizer - não há linha dura entre linguagens funcionais e imperativas. As línguas da família ML não são livres de efeitos colaterais e suportam declarações e estruturas imperativas e variáveis ​​mutáveis. Algumas linguagens imprescindíveis - como Python e Javascript - têm características significativas extraídas da programação funcional. Pessoalmente, espero ver mais idéias funcionais no uso convencional - especialmente na correspondência de padrões.
precisa saber é o seguinte
1
Ter alguns recursos comuns às linguagens funcionais não necessariamente torna a linguagem "funcional". A programação funcional é tanto uma maneira de pensar e projetar programas quanto recursos de linguagem específicos.
Mipadi
2
@mipadi - e, portanto, você pode aplicar a filosofia funcional em qualquer idioma, na medida em que as ferramentas disponíveis permitirem. Você pode escrever código de estilo funcional em Python (dentro dos limites) e, nessa medida, Python é uma linguagem funcional. E você pode escrever código no estilo imperativo no ML, e nessa medida o ML é uma linguagem imperativa. Isso não é exatamente o mesmo que "os programadores ruins podem escrever o Fortran em qualquer idioma", embora obviamente essa seja uma armadilha fácil de cair se você interpretar mal o meu argumento.
precisa saber é o seguinte
1
@ mipadi - mas se a linguagem imperativa tivesse todas as construções funcionais normais, você poderia fazer qualquer coisa com ela em uma linguagem funcional - a lacuna seria fechada e a pergunta seria "qual é a melhor maneira de fazer isso" em vez de "qual é a maneira funcional / imperativa". A família ML já preencheu essa lacuna, realmente, mas como é chamado funcional, pensamos em seu estilo como estilo funcional, e não simplesmente como bom estilo.
Steve314

Respostas:

24

Em quais cenários devo considerar uma linguagem de programação funcional mais adequada para executar uma determinada tarefa? Além do tão recentemente popular problema multicore da programação paralela.

Qualquer coisa que envolva a criação de sequência de elementos de dados derivados usando várias etapas de transformação.

Essencialmente, o "problema da planilha". Você tem alguns dados iniciais e um conjunto de cálculos linha a linha para aplicar a esses dados.

Nossos aplicativos de produção fazem vários resumos estatísticos de dados; tudo isso é melhor abordado funcionalmente.

Uma coisa comum que fazemos é uma combinação de correspondência entre três conjuntos de dados monstruosos. Semelhante a uma junção SQL, mas não tão generalizada. Isto é seguido por vários cálculos de dados derivados. Tudo isso são apenas transformações funcionais.

O aplicativo é escrito em Python, mas é escrito em um estilo funcional usando funções de gerador e tuplas nomeadas imutáveis. É uma composição de funções de nível inferior.

Aqui está um exemplo concreto de uma composição funcional.

for line in ( l.split(":") for l in ( l.strip() for l in someFile ) ):
    print line[0], line[3]

Essa é uma maneira pela qual a programação funcional influencia linguagens como Python.

Às vezes, esse tipo de coisa é escrito como:

cleaned = ( l.strip() for l in someFile )
split = ( l.split(":") for l in cleaned )
for line in split:
     print line[0], line[3]

Se eu decidisse mudar para uma linguagem de programação funcional que você considera as maiores armadilhas que eu enfrentarei? (Além da mudança de paradigma e da dificuldade de avaliar o desempenho devido à avaliação preguiçosa).

Objetos imutáveis ​​é o obstáculo mais difícil.

Geralmente, você acaba calculando valores que criam novos objetos em vez de atualizar objetos existentes. A idéia de que é um atributo mutável de um objeto é um hábito mental difícil de ser quebrado.

Uma propriedade derivada ou função de método é uma abordagem melhor. Objetos com estado são um hábito difícil de quebrar.

Com tantas linguagens de programação funcionais por aí, como você escolheria a que melhor se adequa às suas necessidades?

Não importa a princípio. Escolha qualquer idioma para aprender. Depois de saber algo, você estará em uma posição que considere escolher outro para melhor atender às suas necessidades.

Eu li Haskell apenas para entender o que falta ao Python.

S.Lott
fonte
5
@edalorzo: Python não é digitado fracamente. É muito, muito fortemente tipado. Não há operador de conversão, por isso é mais fortemente digitado que Java ou C ++.
S.Lott
5
@ S.Lott - a verificação de tipo estático não ajuda nas ferramentas de refatoração de IDE e coisas do tipo intellisense? Se você tem a compilação em segundo plano e está verificando estaticamente os tipos, isso não significa que você pode automatizar mais suas ferramentas? Concordo que, se você tiver 100% de cobertura de código em seus testes, ele será capturado. Você deve perceber que provavelmente menos de 50% do código de produção na empresa realmente tem cobertura de teste de unidade, certo? :) Há um mundo real lá fora, nós temos que viver.
Scott Whitlock
8
@ S.Lott "A verificação de tipo estático não é tão útil. Não importa muito se há verificação estática por um compilador ou por tempo de execução. Você ainda escreve a mesma quantidade de código e o mesmo número de testes de unidade. " Err, não. O ponto principal da verificação de tipo estático é que ele captura bugs e, consequentemente, reduz massivamente a quantidade de testes necessários.
Jon Harrop
3
@ S.Lott "O Python não é digitado fracamente. É muito, muito fortemente digitado." O Python lança implicitamente entre tipos numéricos, que estão sendo digitados fracamente.
Jon Harrop
3
@ Steve314 "Afinal, a verificação de tipo estático detecta alguns erros que se encaixam em algumas regras básicas. O teste de unidade, em princípio, pode detectar todos esses erros e muito mais." Não. A verificação estática prova a correção de um aspecto de um programa. O teste de unidade procura refutar a correção, mas não prova a correção de nada. O teste de unidade não substitui a verificação de tipo estático nem qualquer outro tipo de prova.
Jon Harrop
23

"Funcional" é um monte de recursos diferentes, cada um dos quais é útil independentemente, e acho mais útil olhar para cada um individualmente.

Imutabilidade

Agora que estou familiarizado, sempre que posso retornar um resultado imutável, sempre tento fazer isso, mesmo em um programa orientado a objetos. É mais fácil argumentar sobre o programa se você tiver dados do tipo valor. Geralmente, você precisa de mutabilidade para coisas como GUIs e gargalos de desempenho. Minhas entidades (usando NHibernate) também são mutáveis ​​(o que faz sentido porque estão modelando dados armazenados em um banco de dados).

Funções como tipos de primeira classe

Como você quiser chamar, delegando delegados, ações ou funções, é uma maneira realmente útil de resolver toda uma classe de problemas do mundo real, como o "buraco no padrão intermediário". Também descobri que passar um delegado, ação ou função para um objeto é mais limpo do que fazer com que essa classe declare um evento e ligue esse evento (supondo que normalmente haja apenas um "ouvinte"). Quando você sabe que há um ouvinte, a ação de retorno de chamada pode ser transmitida como um parâmetro construtor (e armazenada em um membro imutável!)

Ser capaz de compor funções (por exemplo, transformar Action<T>- se em apenas um Actiontambém é bastante útil em alguns cenários.

Também devemos observar a sintaxe do Lambda aqui, porque você só obtém a sintaxe do Lambda quando promove funções para tipos de primeira classe. A sintaxe do Lambda pode ser muito expressiva e concisa.

Mônadas

É certo que este é meu ponto fraco, mas meu entendimento é que os fluxos de trabalho computacionais em F #, como o asyncfluxo de trabalho, são uma mônada. Essa é uma construção sutil, mas muito poderosa. É tão poderoso quanto a yieldpalavra - chave usada para criar IEnumerableclasses em C #. Essencialmente, está construindo uma máquina de estado para você, mas sua lógica parece linear.

Avaliação e Recursão Preguiçosas

Eu os reuni porque, embora eles sempre estejam agrupados como recursos de programação funcional, eles foram criados tão rapidamente em linguagens imperativas que é difícil chamá-las de funcionais.

Expressões S

Acho que não tenho certeza de onde colocar isso, mas a capacidade de tratar o código não compilado como um objeto (e inspecionar / modificá-lo), como Lisp S-Expressions ou LINQ Expressions, é, de certa forma, a ferramenta mais poderosa de programação funcional. A maioria das novas interfaces "fluentes" do .NET e DSLs usam uma combinação de sintaxe lambda e expressões LINQ para criar algumas APIs muito concisas. Sem mencionar Linq2Sql / Linq2Nhibernate onde seu código C # é "magicamente" executado como SQL em vez de como código C #.

Essa foi a resposta longa para a primeira parte da sua pergunta ... agora ...

Se eu decidisse mudar para uma linguagem de programação funcional que você considera as maiores armadilhas que eu enfrentarei? (Além da mudança de paradigma e da dificuldade de avaliar o desempenho devido à avaliação preguiçosa).

A maior armadilha que enfrentei foi tentar encontrar a linha entre o uso de soluções funcionais e soluções imperativas. No entanto, depois de tentar as duas abordagens algumas vezes, você começa a ter uma ideia de que funcionará melhor.

Com tantas linguagens de programação funcionais por aí, como você escolheria a que melhor se adequa às suas necessidades?

Se você conhece o .NET, sugiro o F #. Por outro lado, se você estiver mais familiarizado com a JVM, sempre haverá o Clojure . Se você é mais acadêmico do que prático, então eu usaria o Common Lisp ou Scheme. Se você já conhece o Python, acredito que já existem muitas construções funcionais disponíveis lá.

Scott Whitlock
fonte
@ Scott Agradecemos sua explicação detalhada. Eu acho que o que você descreve como a maior armadilha seria retirado da equação usando uma linguagem de programação funcional pura como Haskell. É por isso que comecei com isso, porque fui um programador imperativo a vida toda e não quero estrelar uma linguagem de programação impura e correrei o risco de não aprender da maneira certa. Se você não se importa que eu faça outra pergunta: duas coisas que me preocupam são ferramentas e bibliotecas. Quão boa é a integração do F # com outras ferramentas e bibliotecas .Net?
Edalorzo 26/04
Não entendo por que você agrupa o código no tempo de execução e na geração e inspeção do código de tempo de execução com programação funcional. Os dois não têm relação um com o outro. Os recursos de metaprogramação que você descreve podem ser adicionados a quase qualquer idioma, funcional ou não. Acho que o lisp iniciou o código como tendência de dados, mas agora está disponível em ruby ​​e outras linguagens não funcionais.
Davidk01:
1
@edalorzo - A integração do F # com o .NET é muito boa, com apenas uma pequena exceção: nenhum designer de GUI. Você pode contornar isso projetando sua GUI em um assembly C # e fazendo referência a F #, ou gerando a GUI dentro do F # apenas no código (não com um designer).
Scott Whitlock
@ davidk01 - boa pergunta sobre meta-programação. Acabei de descobrir que a sintaxe lambda e a metaprogramação se baseiam umas nas outras, mas você está certo, elas podem ser separadas. Parece que é mais provável que você tenha metaprogramação com uma linguagem funcional.
Scott Whitlock
1
@ Scott: Eu acho que de muitas maneiras é mais fácil - por exemplo, quando você não precisa se preocupar com efeitos colaterais, pode modificar uma seção de código em tempo real com muito mais confiança - isso limita o que você precisa mudar.
Michael K
15

E esse tem sido o caso há algum tempo. A programação funcional simplesmente não se tornou tão popular quanto outros modelos (isto é, programação orientada a objetos).

Isso é verdade se você contar os programas desenvolvidos por programadores profissionais (ou pelo menos as pessoas que se veem como tal). Se você expandir sua rede para incluir programas desenvolvidos por pessoas que não se consideram como tal, o FP (ou pelo menos a programação em um estilo funcional) está bem próximo do OO (Excel, Mathematica, Matlab, R ... até mesmo o JavaScript 'moderno' )

Em quais cenários devo considerar uma linguagem de programação funcional mais adequada para executar uma determinada tarefa? Além do tão recentemente popular problema multicore da programação paralela.

Minha opinião pessoal é que o multicore não é o principal recurso do FP (pelo menos até os compiladores Haskell, Scala, Clojure, F # resolverem o problema de localidade do cache). A característica do assassino é map, filter, folde amigos que permitem uma expressão mais sucinta de um grande grupo de algoritmos. Isso é composto pelas linguagens FP que possuem uma sintaxe mais concisa do que as versões OO mais populares.

Além disso, o fato de o FP estar mais próximo do modelo relacional reduz a incompatibilidade de impedância com o RDBMS ... o que é - novamente pelo menos para os não programadores - muito bom.

Além disso, quando você tem dificuldades particularmente difíceis de satisfazer os requisitos de 'correção' - de uma forma que é difícil de testar (comum em computação científica / análise de grandes dados em que o objetivo é se tornar previamente desconhecido e, portanto, resultados inespecíficos), a FP pode oferecer vantagens.

Se eu decidisse mudar para uma linguagem de programação funcional que você considera as maiores armadilhas que eu enfrentarei?

  • falta de suporte de ferramentas (F # e alguns Lisps sendo a exceção, Scala a caminho)
  • mais difícil de extrair o último pedaço de desempenho do seu hardware
  • comunidades geralmente focando em questões diferentes das enfrentadas por um grande grupo de projetos comerciais de desenvolvimento de software
  • pouquíssimos desenvolvedores com experiência no uso de PF em um ambiente industrial e, se puder encontrá-los, provavelmente terá que competir com o salário e os benefícios que o setor financeiro pode oferecer
  • o estilo funcional de programação tende a ser mais difícil de depurar; ou seja, observar resultados entre uma longa cadeia de funções compostas geralmente não é possível na maioria (todos?) depuradores

Com tantas linguagens de programação funcionais por aí, como você escolheria a que melhor se adequa às suas necessidades?

  • Quantos de seus problemas podem ser resolvidos já saindo de bibliotecas / estruturas em qual plataforma (por exemplo, JVM ou .Net), quantas são novas? Existem construções de linguagem capazes de expressar esses problemas diretamente?

  • Quanto controle de baixo nível você precisa sobre o desempenho de espaço e tempo do seu aplicativo?

  • Quão rigorosos são os seus requisitos de "correção"?

  • Você pode se capacitar para treinar novamente os desenvolvedores e / ou competir com os benefícios oferecidos por alguns nichos altamente lucrativos no desenvolvimento de software?

Alexander Battisti
fonte
+1 @Alexander, esta é certamente uma das melhores respostas nesta discussão. Você trouxe uma nova dimensão de argumentos para a discussão, apresentando o fator humano, a dificuldade de encontrar desenvolvedores qualificados e mantê-los motivados. Eu concordo totalmente com a sua visão das características matadoras dos langs FP, porque todos os dias eu vejo linguagens mais imperativas adotando-as também. Mas sua postagem me abriu os olhos para perceber que ainda existem muitas coisas que ainda não sei sobre a FP. Finalmente, seu ponto de basear-se em uma plataforma existente como .Net ou Java é certamente muito válido e totalmente sensato.
Edalorzo 26/04
9

Se eu decidisse mudar para uma linguagem de programação funcional que você considera as maiores armadilhas que eu enfrentarei? (Além da mudança de paradigma e da dificuldade de avaliar o desempenho devido à avaliação preguiçosa).

Supondo que você seja um desenvolvedor C ++ / C # / Java no setor ...

Esteja preparado para colegas mal-humorados que não querem aprender nada. Esteja preparado para chefes de cabelos pontudos impondo más escolhas de linguagem "porque eles já foram codificadores". Esteja preparado para acadêmicos expressivos em fóruns patrocinando você sobre monóides. Esteja preparado para guerras intermináveis ​​de idiomas, porque o Scala nem sequer tem eliminação de chamada de cauda e o Clojure realmente exige pedais para todos os suportes e não me inicie no Erlang.

Se você é um programador de web, a maior armadilha provavelmente será seu cabelo.

Com tantas linguagens de programação funcionais por aí, como você escolheria a que melhor se adequa às suas necessidades?

Eu começaria com a plataforma:

  • O OCaml é ótimo no Linux e péssimo no Windows.
  • O F # é ótimo no Windows e péssimo no Linux.
  • Scala e Clojure são ótimos na JVM.
Jon Harrop
fonte
1
Quando leio "Esteja preparado para colegas mal-humorados que não querem aprender nada". Eu queria gritar: "Tão verdade! Tão verdade!" mas é muito triste.
Zelphir Kaltstahl
3

Para uma perspectiva (reconhecidamente tendenciosa) sobre essa questão, você pode conferir o blog de Bob Harper, Existential Type . Carnegie Mellon recentemente reformulou seu currículo de CS para ensinar programação funcional primeiro, com outros paradigmas sendo ensinados apenas quando uma base sólida em programação funcional foi estabelecida, e Harper está dando um golpe por golpe à medida que o novo currículo é implementado na prática. .

Harper é um dos principais desenvolvedores da linguagem de programação Standard ML, por isso é justo dizer que sua própria opinião sobre o assunto pode ser adivinhada com antecedência, e ele certamente não se esquiva de declarações controversas ao defender essa posição, mas ele faz o caso dele também.

jimwise
fonte
1
+1 Este artigo é certamente muito interessante e vou mantê-lo nos meus favoritos a partir de agora. Eu acho que ensinar FP primeiro é certamente uma boa abordagem, porque é realmente difícil se livrar do pensamento imperativo se você fizer isso de outra forma e, acima de tudo, se você não usar uma linguagem de programação puramente funcional, é difícil quebrar o velho hábitos. Também vejo que as principais linguagens de POO estão incorporando recursos funcionais e, portanto, a aquisição das habilidades e do estado de espírito de um programador funcional deve ser realmente útil no futuro próximo. Introspecção interessante, obrigado!
Edalorzo
@ Jimwise: +1 para o artigo de Harper. Acho a abordagem dele muito apropriada. @edalorzo: Quando você começa a pensar funcionalmente, vê o paradigma imperativo como último recurso a ser aplicado para otimizar seu programa quando ele não é rápido o suficiente. Escrevi recentemente algumas pequenas ferramentas no Scala, não muito grandes, mas não triviais e com algumas funcionalidades reais. Para minha surpresa, eu não usei varou qualquer coleção mutável uma única vez. Portanto, o pensamento imperativo é da OMI algum tipo de otimização prematura que, como todos sabemos, é a raiz de todo mal.
Giorgio
2

Em quais cenários devo considerar uma linguagem de programação funcional mais adequada para executar uma determinada tarefa? Além do tão recentemente popular problema multicore da programação paralela.

Não existe uma fórmula mágica que diga quando usar a programação funcional. Não é como se a programação orientada a objetos fosse adequada para nossas situações atuais de programação. É apenas outra maneira de estruturar programas em termos de outro conjunto de abstrações.

Se eu decidisse mudar para uma linguagem de programação funcional que você considera as maiores armadilhas que eu enfrentarei? (Além da mudança de paradigma e da dificuldade de avaliar o desempenho devido à avaliação preguiçosa).

A programação funcional não tem nada a ver com preguiça. ML e OCaml são linguagens funcionais e estritas. O maior obstáculo que você enfrentará é estruturar as coisas em termos de valores imutáveis ​​e envolver sua mente em qualquer abstração usada no sistema de tipos para efeitos colaterais. As linguagens funcionais são mais adequadas para otimização devido ao fato de tornarem os efeitos colaterais muito explícitos no sistema de tipos. Haskell usa mônadas, mas existem outras abordagens para usar efeitos em linguagens funcionais puras. O Clean possui tipos de exclusividade e algumas outras linguagens no desenvolvimento têm outras coisas.

Com tantas linguagens de programação funcionais por aí, como você escolheria a que melhor se adequa às suas necessidades?

Entre as linguagens de programação que eu conheço, eu diria que apenas Haskell e Clean podem ser chamadas de linguagens funcionais. Todos os outros permitem efeitos colaterais sem explicitar esses efeitos no sistema de tipos. Então, se você vai dedicar tempo para aprender programação funcional, Haskell é provavelmente o único que se adequa à conta. Todos os outros que eu conheço, Erlang, Scala, Clojure etc. apenas fornecem abstrações funcionais sobre uma linguagem imperativa. Portanto, se você quiser abordar o paradigma funcional em bits, recomendo Scala ou Erlang e se você quiser resolver tudo de uma vez e possivelmente desistir de frustração, deve usar Haskell.

davidk01
fonte
@ Dadivk01 +1 Gosto do raciocínio de que os langs FP são apenas uma ferramenta competitiva como qualquer outra e podem ser usados ​​para resolver os mesmos problemas que os resolvidos com outros modelos. Por que você acha que eles são menos populares, então? E, você ainda concorda que eles são mais adequados para resolver o problema da computação paralela do que, por exemplo, a maioria dos langs de OOP? Você diria que o tipo de dados imutáveis ​​tem alguma influência na pegada da memória e no desempenho quando comparado aos intervalos imperativos? Eu estava dando-lhe uma chance de Haskell, por que você diz "dar-se em frustração", você está me assustando, cara :)
edalorzo
@edalorzo: Eu não acho que a programação funcional seja melhor para algoritmos paralelos. As pessoas confundem programação declarativa com programação funcional. O que a programação funcional tem a oferecer é sua natureza declarativa e um monte de pessoas realmente inteligentes escrevendo excelentes compiladores para traduzir código declarativo em código de máquina. Qualquer outra linguagem que se incline mais para descrever problemas, em vez de explicar explicitamente detalhes menores, será igualmente boa para a programação paralela.
Davidk01:
@edalorzo: Quanto a "desistir de frustração", digo que, se a programação imperativa é tudo que você sabe, o sistema de tipos de haskell e sua abordagem monádica para descrever efeitos podem ser um pouco demais. Eu acho que é melhor começar com uma linguagem que adote uma abordagem mais pragmática para efeitos colaterais como Erlang e Scala.
Davidk01:
0

Eu atribuiria o aumento atual de interesses em linguagens funcionais ao fato de serem ideais para computação paralela. Por exemplo, toda a idéia de redução de mapa é baseada em paradigma funcional. E não há dúvida de que a computação paralela estará em alta, pois é claro que atualmente a expansão é muito mais fácil e barata do que a expansão. Mesmo no mercado consumidor, as CPUs obtêm mais núcleos, não mais GHz.

EDIT: uma vez que não é óbvio para todos.

Na programação funcional pura, uma função recebe entrada, produz saída e não tem efeitos colaterais. Não ter efeito colateral, significa que ele não possui estado compartilhado, portanto, não há necessidade de mecanismos de sincronização, que seriam necessários durante a execução simultânea. A sincronização é a parte mais difícil de qualquer software simultâneo / paralelo, tornando-o puramente funcional, você basicamente não precisa lidar com a parte mais difícil.

Quanto à redução de mapa, até o nome vem da programação funcional (tanto o mapeamento quanto a redução são operações típicas no paradigma funcional). As duas etapas de redução de mapa são funções que são executadas em paralelo, recebem entrada, produzem saída e não têm efeito colateral. Portanto, essa é exatamente a idéia pura de programação funcional.

Poucos exemplos de PF usados ​​para paralelismo:

  • CouchDB - construído em Erlang
  • Bate-papo no Facebook - construído em Erlang
  • Twitter - grande parte construída no Scala
vartec
fonte
3
Todo mundo faz a alegação de programação paralela, mas há muito poucos dados para fazer o backup. Se você conhece essas fontes, deve citá-las. Cálculos complexos geralmente têm dependências de dados complexas e se você usar um paradigma de programação funcional, a interdependência de dados inerente de alguns modelos não desaparecerá magicamente. Programação GPU é tão paralelo quanto ele ganha, mas eles ficam usando linguagens imperativas muito bem porque os modelos com os quais trabalham têm paralelismo construído dentro.
davidk01
4
@artec: No interesse da objetividade, ainda seria bom se você pudesse fornecer uma referência que faça backup de suas reivindicações. Ajudaria os leitores ignorantes muito mais do que uma contra-pergunta ... #
26601
1
@artec: Na verdade não, nunca me ocorreu que muitas pessoas fazendo alguma afirmação a tornassem realidade. Eu culpo meu treinamento em matemática, mas nem todos acreditamos em fatos concretos e justificativas concretas para nossas reivindicações, e sua edição ainda não aborda meu comentário.
Davidk01
1
@vartec Você pode colocar uma referência a uma fonte confiável que apóia suas reivindicações.
Quant_dev 18/05/11
1
+1 @ davidk01 "Todo mundo faz a alegação de programação paralela, mas há muito poucos dados para fazer o backup". Estou ciente de uma enorme quantidade de evidências em contrário. Por exemplo, os documentos de Cilk descrevem como a mutação no local é essencial se você deseja uma boa complexidade de cache, que é um requisito de paralelismo escalável em um multicore.
31912 Jon Jonop