Um pouco sobre Functional Programming
Autor: Marcus Miris | Publicado: 2017-01-13T10:39:00-02:00



Fiz uma pesquisa rápida sobre&nbsp;Functional Programming, e abaixo fiz uma pequena compilação do que encontrei. Alguns dos trechos de texto dispostos aqui forma copiados de sites, e acredito que todos estão referenciados nos links.




REGRAS BÁSICAS

Não há variáveis em Functional Programming;
Recursão é usada ao invés de estruturas de loop;
Imutabilidade cria códigos mais simples e seguros;


Mais informações:&nbsp;https://medium.com/@cscalfani/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536#.ksj3rzo7d



PURE FUNCTIONS

Operam apenas sobre seus parâmetros de entrada;
Devem retornar alguma coisa (nunca são void);
Sempre produzem o mesmo output&nbsp;quando dados os mesmos inputs;
Não há efeitos colaterais



Mais informações:&nbsp;https://medium.com/@cscalfani/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536#.ksj3rzo7d





 HIGHER ORDER FUNCTIONS
Higher-order functions são funções que (1) recebem funções em seus argumentos; ou (2) retornam funções.

e.g.: 


<!-- HTML generated using hilite.me -->

Func&lt;int, bool&gt; isEven = x =&gt; x % 2 == 0;
Func&lt;int, bool&gt; not(Func&lt;int, bool&gt; f) = x =&gt; !f(x);

Func&lt;int, bool&gt; isOdd = not(isEven); &lt;-- HIGHER ORDER FUNCION




Mais informações:


http://elemarjr.com/pt/2010/08/24/functional-programming-higher-order-functions/
http://elemarjr.com/pt/2011/11/13/functional-programming-higher-order-functions-com-javascript/
http://elemarjr.com/pt/2012/06/16/haskell-para-programadores-c-parte-7-higher-order-functions/



 MEMOIZATION
Reutiliza o resultado de execuções prévias

Mais informações:


http://elemarjr.com/2010/08/24/functional-programmingoutras-consideraes-2/




COMBINATORS / COMPOSITION
São Higher-Order Functions que usam somente funções e outros combinators para entregar novas funcionalidades. É uma espécie de decorator para função, ampliando uma função original.

e.g.:

<!-- HTML generated using hilite.me -->

Func&lt;int, int, int&gt; soma = (x, y) =&gt; x + y;

/* este método é um combinator */
Func&lt;int, int, int&gt; logarOperacao = (Func&lt;int, int, int&gt; f) =&gt; {
 return (x, y) =&gt; {
  var result = f(x, y);
  Console.WriteLine($"Resultado: { result }");
  return result;
 }
}

// combina.
soma = logarOperacao(soma);
soma(1, 2);
soma(3, 4);



Mais informações:


http://elemarjr.com/pt/2012/01/05/produzindo-codigo-mais-elegante-com-combinators-em-c/



 CURRYING / PARTIAL APPLICATION

e.g CURRYING.:

Func&lt;int, int, int&gt; add = a =&gt; b =&gt; a + b;
Console.Write(add(2)(5));  // == 7!




P) qual a vantagem?

R) autoriza a utilização de uma técnica chamada "Partial Application";




 PARTIAL APPLICATION 

Permite que criemos uma nova função com base em uma existente. Geralmente, partimos de uma função mais genérica para criar uma função com aplicação mais expecífica.

<!-- HTML generated using hilite.me -->

Func&lt;int, int, int&gt; add = (a, b) =&gt; a + b;
Func&lt;int, int&gt; add2 = a =&gt; add(a, 2);



Mais informações:

http://elemarjr.com/pt/2012/02/09/tornando-o-cdigo-mais-elegante-com-currying-e-partial-application-em-c/