Quais são os benefícios da programação funcional? [fechadas]

95

Quais são os benefícios da programação funcional? E como eles se aplicam aos programadores hoje?

Quais são as maiores diferenças entre a programação funcional e OOP?

Rayne
fonte
5
O paradoxo do Blub. paulgraham.com/avg.html
missingfaktor

Respostas:

75

O estilo de programação funcional é descrever o que você deseja, em vez de como obtê-lo. ie: em vez de criar um loop for com uma variável iteradora e marchar através de um array fazendo algo em cada célula, você diria que o equivalente a "este rótulo se refere a uma versão deste array onde esta função foi feita em todos os elementos. "

A programação funcional move ideias de programação mais básicas para o compilador, ideias como compreensões de lista e cache.

O maior benefício da programação funcional é a brevidade, porque o código pode ser mais conciso. Um programa funcional não cria uma variável iterativa para ser o centro de um loop, portanto, esse e outros tipos de sobrecarga são eliminados de seu código.

O outro benefício principal é a simultaneidade, que é mais fácil de fazer com a programação funcional porque o compilador está cuidando da maioria das operações que costumavam exigir a configuração manual de variáveis ​​de estado (como o iterador em um loop).

Alguns benefícios de desempenho também podem ser vistos no contexto de um processador único, dependendo da maneira como o programa é escrito, porque a maioria das linguagens funcionais e extensões oferecem suporte a avaliação lenta. Em Haskell, você pode dizer "este rótulo representa uma matriz contendo todos os números pares". Esse array é infinitamente grande, mas você pode solicitar o 100.000º elemento desse array a qualquer momento, sem precisar saber - no momento da inicialização do array - qual é o maior valor de que você precisará. O valor será calculado apenas quando você precisar dele e não mais.

Chris Wenham
fonte
12
Acho que seu primeiro parágrafo está mais perto de descrever a programação relacional declarativa como Prolog do que a programação funcional.
McPherrinM
6
@McPherrinM: as linguagens funcionais são declarativas, ao invés de imperativas.
Lie Ryan
2
Parece que você está confundindo DP x IP com procedural x FP . O FP está fornecendo a separação de interesses enfatizando a composição da função, isto é, separando as dependências entre as subcomputações de uma computação determinística.
Shelby Moore III
2
@LieRyan incorreto. Por favor, veja o link em meu comentário anterior
Shelby Moore III
Simultaneidade é ter vários threads que podem interagir uns com os outros, o que é imperativo. Fazer vários cálculos independentes ao mesmo tempo é chamado de paralelismo . Consulte en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy
29

O maior benefício é que não é o que você está acostumado. Escolha uma linguagem como Scheme e aprenda a resolver problemas com ela, e você se tornará um programador melhor em linguagens que já conhece. É como aprender uma segunda língua humana. Você supõe que os outros são basicamente uma variação em si mesmo, porque você não tem nada para compará-los. A exposição a outras pessoas, em particular aquelas que não estão relacionadas com o que você já sabe, é instrutiva.

Kirk Strauser
fonte
28
isso é um benefício de aprender, não um benefício do próprio paradigma
Moe,
2
Mas eles estão realmente separados? Do ponto de vista do questionador original, eu diria que não - eles estão provavelmente procurando benefícios no total de gastar o esforço para aprender uma linguagem funcional.
Kendall Helmstetter Gelner
3
"isso é um benefício de aprender, não um benefício do próprio paradigma". O paradigma irá vazar para seu outro trabalho OOP e pode ajudar a simplificar seu desenvolvimento. Você pode abordar os problemas de "computar esta saída a partir desta entrada" e "compor essas duas funções que computam novos dados" em vez de "esperar --- qual era o estado de alguma variável compartilhada ali?" e "consegui que esses procedimentos fossem executados na ordem correta?". Sério, você obtém esses benefícios (por entender o paradigma FP) em Python, C #, C ++, Java, etc.
Jared Updike
11

Por que a programação funcional é importante
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Resumo

À medida que o software se torna cada vez mais complexo, é cada vez mais importante estruturá-lo bem. Um software bem estruturado é fácil de escrever e depurar e fornece uma coleção de módulos que podem ser reutilizados para reduzir custos de programação futuros.

Neste artigo, mostramos que duas características das linguagens funcionais em particular, funções de ordem superior e avaliação preguiçosa, podem contribuir significativamente para a modularidade. Como exemplos, manipulamos listas e árvores, programamos vários algoritmos numéricos e implementamos a heurística alfa-beta (um algoritmo de Inteligência Artificial usado em programas de jogos). Concluímos que, uma vez que a modularidade é a chave para uma programação de sucesso, a programação funcional oferece vantagens importantes para o desenvolvimento de software.

Robert Harvey
fonte
10

Um bom ponto de partida, portanto, seria tentar entender algumas coisas que não são possíveis em linguagens imperativas, mas possíveis em linguagens funcionais.

Se você está falando sobre computabilidade, é claro que não há nada que seja possível na programação funcional, mas não imperativa (ou vice-versa).

O objetivo dos diferentes paradigmas de programação não é tornar possíveis coisas que não eram possíveis antes, mas sim tornar fáceis as coisas que antes eram difíceis.

A programação funcional visa permitir que você escreva mais facilmente programas concisos, sem bugs e passíveis de paralelização.

sepp2k
fonte
5

Não precisa ser um ou outro: usar uma linguagem como C # 3.0 permite que você combine os melhores elementos de cada um. OO pode ser usado para a estrutura de grande escala no nível de classe e acima. Estilo funcional para a estrutura de pequena escala no nível de método.

Usar o estilo Funcional permite que o código seja escrito que declare sua intenção claramente, sem ser misturado com instruções de fluxo de controle, etc. Por causa dos princípios como programação livre de efeitos colaterais, é muito mais fácil raciocinar sobre o código e verificar sua exatidão .

Samuel Jack
fonte
5

Acho que o exemplo mais prático da necessidade de programação funcional é a simultaneidade - os programas funcionais são naturalmente thread-safe e, devido ao surgimento do hardware de vários núcleos, isso é de extrema importância.

A programação funcional também aumenta a modularidade - muitas vezes você pode ver métodos / funções imperativos que são muito longos - você quase nunca verá uma função com mais do que algumas linhas. E como tudo está desacoplado - a reutilização é muito melhorada e o teste de unidade é muito, muito fácil.

Bozhidar Batsov
fonte
3

Uma vez que o programa cresce, o número de comandos em nosso vocabulário torna-se muito alto, tornando-o muito difícil de usar. É aqui que a programação orientada a objetos torna nossa vida mais fácil, porque nos permite organizar nossos comandos de uma maneira melhor. Podemos associar todos os comandos que envolvem cliente a alguma entidade cliente (uma classe), o que torna a descrição muito mais clara. No entanto, o programa ainda é uma sequência de comandos que especifica como deve proceder.

A programação funcional oferece uma maneira completamente diferente de estender o vocabulário. Não limitado a adicionar novos comandos primitivos; também podemos adicionar novas estruturas de controle - primitivas que especificam como podemos colocar comandos juntos para criar um programa. Em linguagens imperativas, fomos capazes de compor comandos em uma sequência ou usando um número limitado de construções embutidas, como loops, mas se você olhar para programas típicos, ainda verá muitas estruturas recorrentes; formas comuns de combinar comandos

Soner Gönül
fonte
1

Não pense na programação funcional em termos de uma "necessidade". Em vez disso, pense nisso como outra técnica de programação que abrirá sua mente, assim como OOP, modelos, linguagem assembly, etc. podem ter mudado completamente sua maneira de pensar quando (se) você os aprendeu. Em última análise, aprender programação funcional o tornará um programador melhor.

Justin Ethier
fonte
0

Se você ainda não conhece a programação funcional, aprendê-la oferece mais maneiras de resolver problemas.

FP é uma generalização simples que promove funções para valores de primeira classe, enquanto OOP é para estruturação de código em larga escala. Há alguma sobreposição, no entanto, onde os padrões de projeto OOP podem ser representados diretamente e muito mais sucintamente usando funções de primeira classe.

Muitas linguagens fornecem FP e OOP, incluindo OCaml, C # 3.0 e F #.

Saúde, Jon Harrop.

JD
fonte