Olá pessoal. Tudo certo?!
Programação Funcional é um estilo de programação. Logo, independe da linguagem. Entretanto, fica bem mais fácil e natural utilizando uma linguagem pensada para esse estilo. O que estou dizendo é que é possível “pensar funcional” em C#. Entretanto, é mais natural “pensar funcional” com F# ou Haskell.
De todas as linguagens funcionais que conheço, a que mais me agrada é Haskell. Por isso, decidi escrever essa série.
Nessa série, tento apresentar Haskell sob a perspectiva de um programador C#. Vejamos o que consigo.
Há algumas alternativas para programar com Haskell. Atualmente, a que mais me agrada é utilizando Hugs. Baixe em haskell.org/hugs.
Conforme o site:
Hugs 98 is a functional programming system based on Haskell 98, the de facto standard for non-strict functional programming languages. Hugs 98 provides an almost complete implementation of Haskell 98.
É levinho. Baixa lá! Executando:
OK! Como você escreveria uma função para considerar o somatório de 1 até 100 em C#? Assim?
var soma = 0;
for (var i = 1; i <= 100; i++)
soma += i;
Vale?! Não?! Uma abordagem mais declarativa seria assim:
Enumerable.Range(1, 100).Sum();
Pois bem, em Haskell seria assim:
sum [1..100]
Pegou!?
Haskell torna muito fácil trabalhar com conceitos matemáticos. LINQ foi fortemente inspirado nessa capacidade. Por isso, vamos começar fazendo alguns paralelos entre Haskell e LINQ.
C#
new[] {1, 2, 3, 4, 5}.First();
Haskell
head [1,2,3,4,5]
ou ainda
head [1..5]
Pegou a idéia?! Lindo, não?!
C#
new[] {1, 2, 3, 4, 5}.Skip(1);
Haskell
tail [1..5]
O que podemos notar é que:
C#, por ser uma linguagem orientada a objetos, coloca o “objeto” em destaque. Repare, a instrução começa com o objeto. Haskell, por outro lado, coloca a função em primeiro lugar.
Percebe?!
C#
new[] {1, 2, 3, 4, 5}.Skip(3);
Haskell
drop 3 [1..5]
C#
new[] {1, 2, 3, 4, 5}.Count();
Haskell:
length [1..5]
C#
new[] {1, 2, 3, 4, 5}.Sum();
Haskell
sum [1..5]
C#
new[] {1, 2, 3, 4, 5}.Aggregate((a, b) => a*b);
Haskell
product [1..5]
C#
new[] {1, 2, 3}.Union(new[] {4, 5});
Haskell
[1..3] ++ [4,5]
C#
{1, 2, 3, 4, 5}.Reverse();
Haskell
reverse [1..5]
Por agora, era isso.
Legal. Bem simples. Ah, o endereço do Haskell está errado. Faltou o http:// no link.
Fixed. Thanks.
To aqui estudando Haskell e programação funcional também. É um negócio muito legal, mas que eu que vai explode a cabeça da maioria dos programadores.
Explode a cabeça de quem não conhece cálculo lambda, que existe desde antes da década de 1950.
Ou seja, explode a cabeça da maioria dos programadores de hoje em dia. As teorias da relatividade são de antes do cálculo lambda, e mesmo assim a maioria das pessoas não conhece. Antiguidade de um conceito não significa democratização deste conceito.
BTW, comentários anônimos são covardes, IMO.
Quais pessoas não conhecem a teoria da relatividade? Os físicos ou as pessoas que não precisam ou não querem saber desse conceito.
Quanto mais antiga uma área do conhecimento, mais fácil de encontrar material especializado sobre ela. Tanto nos níveis básicos, quanto em livros especializados. Deste modo, é possível encontrar um vasto material para leigos e para especialistas. Isso não se restringe somente à Física ou à Ciência da Computação. Pela Internet, existem sites de universidades que disponibilizam o conteúdo de suas aulas e, há sites com uma infinidade de artigos sobre computação, com seus mais variados temas. E, por fim, o Wikipedia favorece um direcionamento inicial para qualquer conhecimento que se queira adquirir.
Pingback: Haskell para programadores C# – parte 2 – Aplicação e escrita de funções « Elemar DEV
Bem intuitivo, gostei
Muito bom! Parabéns!
Tem um material no channel 9 bem legal também pra quem não tem problema com inglês.
Comecei a estudar com o material do channel 9 e aprendi bastante =)
Tem uma serie de conhecimentos que temos pouco material em português. Parabéns pela iniciativa de blogar tanto sobre coisas “não triviais” para maioria…
Muito obrigado, man
Pingback: Haskell para programadores C# – parte 3 – Tipos! Tipos! Tipos! .. e classes (?!). « Elemar DEV
Pingback: Haskell para programadores C# – parte 4– Respostas condicionais « Elemar DEV
Pingback: F# para programadores C# – Parte 1 | Rodrigo Vidal
Pingback: Haskell para programadores C# – parte 8 – Composition « Elemar DEV
Pingback: Haskell para programadores C# – parte 9 – Modules « Elemar DEV