9 June, 2012 0 Comments AUTHOR: elemarjr CATEGORIES: Sem categoria Tags: , ,

Haskell para programadores C# – parte 1 – primeiros passos

Tempo de leitura: Less than a minute

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.

Para você começar…

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:

image

Esquentando os motores

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;
&#91;/sourcecode&#93;
</pre>
</div>

<p>Vale?! Não?! Uma abordagem mais declarativa seria assim:</p>

<div style="margin:0;display:inline;float:none;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:60e67b7c-20b7-4e1c-adef-ea088927c2b3" class="wlWriterEditableSmartContent"><pre style="white-space:normal;">

Enumerable.Range(1, 100).Sum();

Pois bem, em Haskell seria assim:

sum [1..100]

Pegou!?

Primeiros “de-para”

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.

head/First

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?!

tail/Skip(1)

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?!

drop n/Skip(n)

C#

new[] {1, 2, 3, 4, 5}.Skip(3);

Haskell

drop 3 [1..5]

length/Count()

C#

new[] {1, 2, 3, 4, 5}.Count();

Haskell:

length [1..5]

sum/Sum()

C#

new[] {1, 2, 3, 4, 5}.Sum();

Haskell

sum [1..5]

product/Aggregate(a, b => a * b)

C#

new[] {1, 2, 3, 4, 5}.Aggregate((a, b) => a*b);

Haskell

product [1..5]

++/Union

C#

new[] {1, 2, 3}.Union(new[] {4, 5});

Haskell

[1..3] ++ [4,5]

reverse/Reverse

C#

{1, 2, 3, 4, 5}.Reverse();

Haskell

reverse [1..5]

Por agora, era isso.

0 Comments

  1. Henrique Ribeiro 4 years ago says:

    Legal. Bem simples. Ah, o endereço do Haskell está errado. Faltou o http:// no link.

    Reply
  2. Giovanni Bassi 4 years ago says:

    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.

    Reply
    • x 4 years ago says:

      Explode a cabeça de quem não conhece cálculo lambda, que existe desde antes da década de 1950.

      Reply
      • Giovanni Bassi 4 years ago says:

        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.

        Reply
        • Pedro 4 years ago says:

          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.

          Reply
  3. Bem intuitivo, gostei 🙂

    Reply
    • 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...

      Reply

Trackbacks for this post

  1. Haskell para programadores C# – parte 2 – Aplicação e escrita de funções « Elemar DEV
  2. Haskell para programadores C# – parte 3 – Tipos! Tipos! Tipos! .. e classes (?!). « Elemar DEV
  3. Haskell para programadores C# – parte 4– Respostas condicionais « Elemar DEV
  4. F# para programadores C# – Parte 1 | Rodrigo Vidal
  5. Haskell para programadores C# – parte 8 – Composition « Elemar DEV
  6. Haskell para programadores C# – parte 9 – Modules « Elemar DEV