Paradigmas de programação são construídos com visões diferentes. A programação estruturada enfatiza utilizar subrotinas sequenciadas em blocos. A programação orientada a objetos abstrai entidades reais (ou não) em objetos que possuem atributos e métodos específicos. A programação imperativa descreve computações em estados, que são alterados por ações e comandos. Por característica, todas essas citadas acima, abordam e atuam sobre problema olhando para 'como' a solução será feita. Contudo, seber como um problema dever ser solucionado, nem sempre é trivial. O paradigma de programação funcional surgiu para alterar a abordagem do problema, abordagem essa diferente dos demais paradigmas. Saber 'como' um problema deve ser atacado nem sempre é uma tarefa simples. Pode ser mais simples conhecer o problema, em vez de conhecer sua solução previamente. Como auxílio, se tem a programação funcional. Ela aborda soluções olhando para 'qual' é o problema em questão, descartando inicialmente a necessidade de conhecer a solução. Um bom exemplo, é a codificação do algoritmo de ordenação Quick Sort, que muitos conhecem. Codificar Quick Sort nas demais linguagens como C++ ou Java demandam extensas linhas, justamente por codificar 'como' a ordenação será feita. Contudo, é possível codificar o Quick Sort em Haskell (uma linguagem de programação funcional) com apenas 6 linhas, olhando simplesmente para a definição do algoritmo, como pode ser visto abaixo. > qsort [] = [ ] > qsort (x:xs) = qsort small ++ mid ++ qsort large > where> small = [y | y<-xs, y<x] > mid = [y | y<-xs, y==x] ++ [x] > large = [y | y<-xs, y>x] Muito mais simples, não é mesmo?! Além de mudar a abordagem do problemas objetos para solucioná-los, o paradigma de programação funcional possui diversas outras vantagens e características. Abaixo estão algumas delas na programação funcional não há alocação explícita de memória ou variáveis, como vemos em C++. A alocação ocorre automaticamente quando uma função em invocada, alocando espaço apenas para os parâmetros que a invocam e para seu valor de retorno. laços de repetição (for, while, do) inexistem explicitamente na programação funcional; repetições de chamadas de comandos é possível através recursividade. Funções recursivas invocam a si mesma, permitindo que uma operação seja feita várias vezes. Abaixo, é exemplificada a impressão em tela de todos os elementos de uma lista. Enquanto ela não for vazia, será impresso o primeiro elemento da lista. > imprimeLista [ ] = [ ] > imprimeLista (x:xs) = print x imprime xs funções podem servir de parâmetro para outras funções. Essas são chamadas de funções de ordem superior. No exemplo abaixo, a função soma é usada como parâmetro da função zipWith' > zipWith’ (+) [4,2,5,6] [2,6,2,3] [6,8,7,9] Nao ha requisitos magníficos para aprender a programar utilizando o paradigma funcional. As linguagens de programacao funcional são bem simples de adaptar e aprender. Basta apenas iniciativa e força de vontade.