sexta-feira, 13 de janeiro de 2017

Um pouco sobre Functional Programming

Fiz uma pesquisa rápida sobre 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;

PURE FUNCTIONS

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


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.:
Func<int, bool> isEven = x => x % 2 == 0;
Func<int, bool> not(Func<int, bool> f) = x => !f(x);

Func<int, bool> isOdd = not(isEven); <-- HIGHER ORDER FUNCION


Mais informações:


MEMOIZATION

Reutiliza o resultado de execuções prévias

Mais informações:



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.:
Func<int, int, int> soma = (x, y) => x + y;

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

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

Mais informações:


CURRYING / PARTIAL APPLICATION


e.g CURRYING.:
Func<int, int, int> add = a => b => 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.
Func<int, int, int> add = (a, b) => a + b;
Func<int, int> add2 = a => add(a, 2);

Mais informações:

Nenhum comentário: