Fiz uma pesquisa rapida sobre Functional Programming, e abaixo fiz uma pequena compilacao do que encontrei. Alguns dos trechos de texto dispostos aqui forma copiados de sites, e acredito que todos estao referenciados nos links.REGRAS BASICASNao ha variaveis em Functional Programming;Recursao e usada ao inves de estruturas de loop;Imutabilidade cria codigos mais simples e seguros;Mais informacoes: https://medium.com/@cscalfani/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536#.ksj3rzo7dPURE FUNCTIONSOperam apenas sobre seus parametros de entrada;Devem retornar alguma coisa (nunca sao void);Sempre produzem o mesmo output quando dados os mesmos inputs;Nao ha efeitos colateraisMais informacoes: https://medium.com/@cscalfani/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536#.ksj3rzo7d HIGHER ORDER FUNCTIONSHigher-order functions sao funcoes que (1) recebem funcoes em seus argumentos; ou (2) retornam funcoes.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 FUNCIONMais informacoes: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/ MEMOIZATIONReutiliza o resultado de execucoes previasMais informacoes:http://elemarjr.com/2010/08/24/functional-programmingoutras-consideraes-2/COMBINATORS / COMPOSITIONSao Higher-Order Functions que usam somente funcoes e outros combinators para entregar novas funcionalidades. E uma especie de decorator para funcao, ampliando uma funcao original.e.g.:Func<int, int, int> soma = (x, y) => x + y;/* este metodo e 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 informacoes:http://elemarjr.com/pt/2012/01/05/produzindo-codigo-mais-elegante-com-combinators-em-c/ CURRYING / PARTIAL APPLICATIONe.g CURRYING.:Func<int, int, int> add = a => b => a + b;Console.Write(add(2)(5)); // == 7!P) qual a vantagem?R) autoriza a utilizacao de uma tecnica chamada "Partial Application"; PARTIAL APPLICATION Permite que criemos uma nova funcao com base em uma existente. Geralmente, partimos de uma funcao mais generica para criar uma funcao com aplicacao mais expecifica.Func<int, int, int> add = (a, b) => a + b;Func<int, int> add2 = a => add(a, 2);Mais informacoes:http://elemarjr.com/pt/2012/02/09/tornando-o-cdigo-mais-elegante-com-currying-e-partial-application-em-c/ Dado o seguinte codigo a ser executado em um Console Application... public static void Main(string[] args) { try { Action @do = null; @do = () => { WriteLine("Hellow World!"); @do(); }; @do(); } catch (Exception ex) { ForegroundColor = ConsoleColor.Red; WriteLine(ex); ResetColor(); } WriteLine("Pressione para continuar."); ReadLine(); }... se o executarmos como Any CPU, o codigo estourara StackOverflowException. Note, entretanto, que este tipo de exception nao e capturado pelo Try-Catch. Isto corre pois StackOverflowException e uma excecao nao gerenciada. Por consequencia ela leva ao encerramento abrupto do processo.Agora, se executarmos o mesmo codigo em Release/x64, a exception nao ocorre. Ha duas razoes pelas quais isso acontece:A funcao Do(int) e classificada como um Tail-Call FunctionAo compilarmos em Release/x64, o compilador inclui otmizacoes no codigo para Tail-Call functions, removendo a recursividade.Uma Tail-Call function e uma funcao cuja ultima operacao realizada e a chamada de uma outra funcao. Neste caso, como Do e recursiva, ela e classificada como `Tail-Recursion Function`.Vamos entao, a efeito de testes, fazer uma modificacao no nosso codigo. @do = () => { WriteLine("Hellow "); @do(); WriteLine("world!"); }; @do(1);Ao executar o codigo agora em Release/x64, novamente e gerado StackOverflowException! E fica a pergunta: Porque? Porque ao incluirmos o WriteLine, descaracterizamos a funcao Do como uma Tail-Call Function.Loops infinitos por si so ja sao um perigo para as aplicacoes. Apesar disso, temos reacoes diferente